[抄题]:

给出一个由小写字母组成的矩阵和一个字典。找出所有同时在字典和矩阵中出现的单词。一个单词可以从矩阵中的任意位置开始,可以向左/右/上/下四个相邻方向移动。

给出矩阵:

doaf
agai
dcan

和字典:

{"dog", "dad", "dgdg", "can", "again"}
 
返回 {"dog", "dad", "can", "again"}

[暴力解法]:

时间分析:

空间分析:

[思维问题]:

  1. 用p指针进行比较,不知道指针应该怎么用,指针就是一个新类,利用其中的TrieNode[] next数组移动即可。表示节点的初始化,
  2. p = p.next[c - 'a'];使节点等于初始化之后的值。
  3. 为防止出现res中有相同单词,每添加一个单词后就设其为空, 不同路线相同结果时要想到

[一句话思路]:

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

在trie的结构中,字母其实是线段和下一个节点共有的,所以trienode中的节点数组命名为next

建树时,每个单词都用p从root开始重新新建

[一刷]:

  1. dfs的参数在总函数中有用的变量一一对应就行了,数组名还是要有的
  2. next[],忘记了 数组括号中一定只能是数字,不能是别的,应该是c - 'a'
  3. board[i][j]直接= 字母c就行了,不用加‘’
  4. 纠结不清的:dfs的表达式上限是由总表达式的上限决定的,
    i < board.length, dfs(i+1)也要带入后符合规则,故
    i < board.length - 1

[二刷]:

  1. 当前字母对应的节点p.next[c - 'a'];非空时,说明trie中已经存了和图中相对应的节点,p就应该指向当前对应的字母节点,否则新建。没有理解
  2. w循环时,其对应的每个单词都要加入到p.word中,没有条件,不理解

[三刷]:

[四刷]:

[五刷]:

[五分钟肉眼debug的结果]:

[总结]:

  1. 当前字母对应的节点p.next[c - 'a'];非空时,说明trie中已经存了和图中相对应的节点,p就应该指向当前对应的字母节点,否则新建。没有理解

[复杂度]:Time complexity: O(4*深度次方,最大m+n) Space complexity: O(<n)

[英文数据结构或算法,为什么不用别的数据结构或算法]:

  1. 新建的一棵trie树,按道理应该习惯命名为root
  2. 可以有几个类,但是只能有一个public的类 其他的你就只能定义class而已
  3. 当 java 一个 class 里面 包含 另一个 class 时,需要将这个子 class 声明为 static,不然经常出错

[关键模板化代码]:

for (String w : words){
TrieNode p = root;
//add a c
for (char c : w.toCharArray()) {
int i = c - 'a';
if (p.next[i] == null) {
p.next[i] = new TrieNode();
}
//asign!
p = p.next[i];
}
//add word
p.word = w;//only mean to w, sure to have word
}

指针开始指向root,之后指向别的

[其他解法]:

[Follow Up]:

[LC给出的题目变变变]:

word search1 : dfs

[代码风格] :

j的for循环写成i了,查了半小时,后悔死。好像老是出现这个错误吧?要避免。

class Solution {
//class
class TrieNode {
TrieNode[] next = new TrieNode[26];
String word;
} public List<String> findWords(char[][] board, String[] words) {
List<String> res = new ArrayList<String>();
TrieNode root = buildTrie(words); for (int i = 0; i < board.length; i++) {
for (int j = 0; i < board[0].length; j++) {
dfs(board, i, j, root, res);
}
}
return res;
}
//dfs
public void dfs(char[][] board, int i, int j, TrieNode p, List<String> res) {
//exit
//no c or no node
char c = board[i][j];
if (c == '#' || p.next[c - 'a'] == null) {//exit in dfs
return ;
}
//asign
p = p.next[c - 'a'];
//add word
if (p.word != null) {
res.add(p.word);
p.word = null;
}
//dfs
board[i][j] = '#';
if (i < board.length - 1) dfs(board, i + 1, j, p, res);
if (j < board[0].length - 1) dfs(board, i, j + 1, p, res);
if (i > 0) dfs(board, i - 1, j, p, res);
if (j > 0) dfs(board, i, j - 1, p, res);
board[i][j] = c;
}
//buildTrie
public TrieNode buildTrie (String[] words) {
//build a root
TrieNode root = new TrieNode();
//add all words's node
for (String w : words){
TrieNode p = root;
//add a c
for (char c : w.toCharArray()) {
int i = c - 'a';
if (p.next[i] == null) {
p.next[i] = new TrieNode();
}
}
//add word
if (p.word != null) {
res.add(p.word);
}
}
return root;
}
}

单词搜索 II · Word Search II的更多相关文章

  1. Leetcode之回溯法专题-79. 单词搜索(Word Search)

    Leetcode之回溯法专题-79. 单词搜索(Word Search) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元 ...

  2. [Swift]LeetCode212. 单词搜索 II | Word Search II

    Given a 2D board and a list of words from the dictionary, find all words in the board. Each word mus ...

  3. LeetCode 79. 单词搜索(Word Search)

    题目描述 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被 ...

  4. Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)

    Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...

  5. leetcode 79. Word Search 、212. Word Search II

    https://www.cnblogs.com/grandyang/p/4332313.html 在一个矩阵中能不能找到string的一条路径 这个题使用的是dfs.但这个题与number of is ...

  6. [LeetCode] 212. Word Search II 词语搜索 II

    Given a 2D board and a list of words from the dictionary, find all words in the board. Each word mus ...

  7. [LeetCode] Word Search II 词语搜索之二

    Given a 2D board and a list of words from the dictionary, find all words in the board. Each word mus ...

  8. [LeetCode] 212. Word Search II 词语搜索之二

    Given a 2D board and a list of words from the dictionary, find all words in the board. Each word mus ...

  9. 【leetcode】212. Word Search II

    Given an m x n board of characters and a list of strings words, return all words on the board. Each ...

随机推荐

  1. Robot Framework中使用HttpLibrary教程and中文支持

    Robot Framework中使用and转参数时,默认不支持中文模式,如图场景: 会出现这种错误 FAIL : UnicodeDecodeError: 'ascii' codec can't dec ...

  2. 移动端rem布局雪碧图解决方案 以及分享腾讯团队的在线雪碧图工具

    先分享一下地址:http://alloyteam.github.io/gopng/ 使用的方法也很简单,将需要的小图标拖进去,全部拖进去后再调位置(每拖一个进去都会帮你排列好,但是没有间隔,所以全部拖 ...

  3. php session目录找不到的错误 Error session_start(): open(/var/lib/php/session error

    问题来源 今天安装一个应用,发现提示 Error session_start(): open(/var/lib/php/session error,估计是找不到写不了啥啥啥. 于是我就去该路径下去看看 ...

  4. Google Flutter框架:使用VS Code进行开发

    虽然进行安卓开发使用Android studio 比较方便 ,但是因为AS太臃肿而且还有一些404问题,就在打算如何进行高效的Android开发,于是找到了Flutter SDK, 他支持使用IDE进 ...

  5. 伴随我整十个年头的校内网,现名 人人网, 是不是要shut down 了

    如题: 每天我都习惯性的登录人人网,虽然现在基本上已经看不到曾经的同学上线了,不过我还是有事没事的往上面post 一些出行的照片,没事无聊的时候上这个网上看看自己曾经的照片,虽然已经无人在线,但是自己 ...

  6. linux python 安装 nose lapack atlas numpy scipy

    linux python 安装 nose lapack atlas numpy scipy --http://lib.csdn.net/article/python/1262 作者:maple1149 ...

  7. 公共的Json操作类

    using System; using System.Data; using System.Text; using System.Collections.Generic; using System.R ...

  8. Java反射机制的适用场景及其利与弊 ***

    一.反射的适用场景是什么? 1).Java的反射机制在做基础框架的时候非常有用,有一句话这么说来着:反射机制是很多Java框架的基石.而一般应用层面很少用,不过这种东西,现在很多开源框架基本都已经给你 ...

  9. ACM-Team Tic Tac Toe

    我的代码: #include <bits/stdc++.h> using namespace std; int main() { char a[3][3]; int i,j=0; for( ...

  10. python使用scikit-learn计算TF-IDF

    1 Scikit-learn下载安装 1.1 简介 1.2 安装软件 2 TF-IDF基础知识 2.1 TF-IDF概念 2.2 举例说明计算 3 Scikit-Learn中计算TF-IDF 3.1 ...