高频算法面试题(字符串) leetcode 212. 单词搜索 II

栏目: 编程工具 · 发布时间: 7年前

内容简介:给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。说明:

leetcode 212. 单词搜索 II

给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。

示例:

输入: 
words = ["oath","pea","eat","rain"] and board =
[
  ['o','a','a','n'],
  ['e','t','a','e'],
  ['i','h','k','r'],
  ['i','f','l','v']
]

输出: ["eat","oath"]

说明:

你可以假设所有输入都由小写字母 a-z 组成。

首先,这道题我们可以构建一个Trie树。

但是,我选择递归。

虽然慢,但是爽。

这次的代码写得欠收拾,但是从0到1解决了,从1到多还不是吃豆芽一样。

走起:

func findWords(board [][]byte, words []string) []string {
    //第一维
    lb := len(board)
    //第二维,命名请忽略哈哈
    lbb := len(board[0])
    //依旧闭包上瘾
    var DFS func (string,int,int,[][]bool) bool 
    DFS = func (s string,x int,y int, flag [][]bool) bool{
        if len(s) == 0 {
            return true
        }
        //越界,或者当前字母不满足构成单词,或者当前字母在当前单词已被使用过就返回false
        if x < 0 || x >= lbb || y < 0 || y >= lb || s[0] != board[y][x] || flag[y][x]{
            return false
        }
        //我们将当前满足条件的字母记忆化
        flag[y][x] = true
        //这里是重点,我们向四个方向分别递归,只要有一个方向能满足就可以返回true
        if DFS (s[1:],x,y+1,flag) || DFS (s[1:],x-1,y,flag) || DFS (s[1:],x,y-1,flag) || DFS (s[1:],x+1,y,flag){
            return true
        }
        //不影响下次
        flag[y][x] = false
        return false
    }
    
    re := []string{}
    for _, v := range words {
        //这里我想的是每个单词都要重新来一个二维数组判断字母是否重复。看着很不顺眼
        flag := [][]bool{}
        for i:=0; i<lb; i++ {
            flag = append(flag,make([]bool,lbb))
        }
        //这里因为不想使用goto,所以来了个二级跳
        needBreak := false
        for i:=0; i<lb; i++ {
            for j:=0; j<lbb; j++ {
                if DFS(v,j,i,flag) {
                    re = append(re,v)
                    needBreak= true
                    break
                }
            }
            if needBreak{
                break
            }
        }
    }
    return re
}

这次的代码比较不满意,需要完善的地方太多了,但是我依然觉得思路更重要一些。当然了,对一个极客来说,手写一个Trie树,获得最好的性能才是目标。OK,以后再说咯哈哈。

算法梦想家,来跟我一起玩算法,玩音乐,聊聊文学创作,咱们一起天马行空!

高频算法面试题(字符串) leetcode 212. 单词搜索 II


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算智能导论

计算智能导论

英吉布雷切特 / 谭营 / 清华大学出版社 / 2010-6 / 59.00元

《计算智能导论(第2版)》导论性地介绍了计算智能的5 个典型范例:人工神经网络、进化计算、计算群体智能、人工免疫系统和模糊系统。它们分别是对生物神经系统、生物进化过程、社会组织的群体行为、自然免疫系统和人类思维过程的成功建模。这些范例已经得到了广泛深入的研究,人们在取得了很大的成功之后,已将研究成果广泛地应用到了众多的实际应用领域。极大提高了人们发现问题,求解问题,尤其是求解复杂科学与工程问题的能......一起来看看 《计算智能导论》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具