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

Each word must be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once in a word.

For example,
Given words = ["oath","pea","eat","rain"] and board =

[
['o','a','a','n'],
['e','t','a','e'],
['i','h','k','r'],
['i','f','l','v']
]

Return ["eat","oath"].

思路:

好奇怪啊,我自己写了一个DFS的代码,这种TLE。网上看看发现要用字典树,其实就是把查询给定字符串的过程简化了。

可是我的代码也查询的很容易啊。为什么我的代码TLE,字典树代码就只要56ms呢?

字典数Trie代码:其中标记使用过字符的方式值得学习

class Solution2 {
class Trie{
public:
Trie *children[]; //指向其子序列 从'a'到'z'
bool leaf; //该结点是否是叶子结点
int idx; //如果该节点是叶子结点, idx是该单词在vector中的序号
Trie()
{
this->leaf = false;
this->idx = ;
fill_n(this->children, , nullptr);
}
}; public:
void insertWords(Trie *root, vector<string>& words, int idx)
{
int pos = , len = words[idx].size();
while(pos < len)
{
if(NULL == root->children[words[idx][pos] - 'a'])
root->children[words[idx][pos] - 'a'] = new Trie();
root = root->children[words[idx][pos++] - 'a'];
}
root->leaf = true;
root->idx = idx;
} Trie * buildTrie(vector<string>& words)
{
Trie * root = new Trie();
for(int i = ; i < words.size(); ++i)
insertWords(root, words, i);
return root;
} void checkWords(vector<vector<char>>& board, int i, int j, int row, int col, Trie *root, vector<string> &res, vector<string>& words)
{
if(i < || j < || i >= row || j >= col) return;
if(board[i][j] == 'X') return; //已经访问过
if(NULL == root->children[board[i][j] - 'a']) return;
char temp = board[i][j];
if(root->children[temp - 'a']->leaf) //这是叶子结点
{
res.push_back(words[root->children [temp - 'a']->idx]);
root->children[temp - 'a']->leaf = false; //标为false表示已经找到之歌单词了
}
board[i][j] = 'X'; //标记这个字母为已找过 checkWords(board, i-, j, row, col, root->children[temp-'a'], res, words);
checkWords(board, i+, j, row, col, root->children[temp-'a'], res, words);
checkWords(board, i, j-, row, col, root->children[temp-'a'], res, words);
checkWords(board, i, j+, row, col, root->children[temp-'a'], res, words); board[i][j] = temp;
} vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
vector<string> res;
int row = board.size();
if(==row) return res;
int col = board[].size();
if(==col) return res;
int wordCount = words.size();
if(==wordCount) return res; Trie *root = buildTrie(words); int i,j;
for(i = ; i<row; i++)
{
for(j=; j<col && wordCount > res.size(); j++)
{
checkWords(board, i, j, row, col, root, res, words);
}
}
return res;
} };

我自己的代码:

class Solution {
public:
vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
if(board.empty()) return vector<string>(); vector<string> ans;
//对所有入口遍历
for(int i = ; i < board.size(); ++i)
{
for(int j = ; j < board[].size(); ++j)
{
string scur;
unordered_set<int> myset;
getAnswer(i, j, board, words, scur, ans, myset);
}
}
return ans;
} void getAnswer(int i, int j, vector<vector<char>>& MyBoard, vector<string> ResWords, string scur, vector<string>& ans, unordered_set<int> myset)
{
if(ResWords.empty()) return; //没有更多的单词
if(i < || j < || i >= MyBoard.size() || j >= MyBoard[].size()) return;
if(myset.find(i * MyBoard[].size() + j) != myset.end()) return; //该字母已经使用过
myset.insert(i * MyBoard[].size() + j);
vector<string> newResWords;
//对所有剩下待匹配的单词(即前面字母都符合,并且没有完全匹配的单词)
for(int k = ; k < ResWords.size(); ++k)
{
if(MyBoard[i][j] == ResWords[k][scur.length()] && ResWords[k].length() == scur.length() + ) //新字母与单词匹配 且单词没有更多的字母 压入答案
ans.push_back(scur + MyBoard[i][j]);
else if(MyBoard[i][j] == ResWords[k][scur.length()]) //若字母匹配 压入新的剩余单词
newResWords.push_back(ResWords[k]);
}
scur += MyBoard[i][j]; getAnswer(i + , j, MyBoard, newResWords, scur, ans, myset);
getAnswer(i - , j, MyBoard, newResWords, scur, ans, myset);
getAnswer(i, j + , MyBoard, newResWords, scur, ans, myset);
getAnswer(i, j - , MyBoard, newResWords, scur, ans, myset);
}
};

【leetcode】Word Search II(hard)★的更多相关文章

  1. 【leetcode】Word Ladder II

      Word Ladder II Given two words (start and end), and a dictionary, find all shortest transformation ...

  2. 【leetcode】Word Break II

    Word Break II Given a string s and a dictionary of words dict, add spaces in s to construct a senten ...

  3. 【leetcode】Word Search

    Word Search Given a 2D board and a word, find if the word exists in the grid. The word can be constr ...

  4. 【leetcode】Word Search (middle)

    今天开始,回溯法强化阶段. Given a 2D board and a word, find if the word exists in the grid. The word can be cons ...

  5. 【leetcode】Word Break II (hard)★

    Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each ...

  6. 【leetcode】Word Ladder II(hard)★ 图 回头看

    Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...

  7. Java for 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 ...

  8. [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 ...

  9. 【LeetCode】47. Permutations II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:递归 方法二:回溯法 日期 题目地址:htt ...

随机推荐

  1. EF-在EF中运行sql语句

    DbRawSqlQuery<int> result2 = db.Database.SqlQuery<int>("SELECT count(*) FROM test.s ...

  2. EF方便的添加一条信息...

    //刚开始通过EF添加数据都是这样的...↓ var db = new DBEntities() T_User t_userinfo = new T_User() { Type = "typ ...

  3. SQL如何将A,B,C替换为'A','B','C'

    因为涉及到逗号,和单引号' 本来想一次转换成功, 但是最后貌似没有好的办法, 只有分两次完成了 select REPLACE(REPLACE('A,B,C',',','>,>'),'> ...

  4. java httpclient发送json 请求 ,go服务端接收

    /***java客户端发送http请求*/package com.xx.httptest; /** * Created by yq on 16/6/27. */ import java.io.IOEx ...

  5. StarWind的安装配置

    将安装包拷贝到本地后,执行以下exe文件,默认下一步,直到安装完成. 需汉化版本则将language_chinese.xml文件拷贝到以下路径: C:\Program Files\StarWind S ...

  6. Mac安装OpenCV

    安装过程参考这篇文章Mac平台上OpenCV开发环境搭建 也可以参考文档官网上的安装文档Installation in Linux(不知道为什么没有Installation in Mac...) 我的 ...

  7. js时间格式化(yy年MM月dd日 hh:mm)

    //时间格式化 Date.prototype.format = function (format) { var o = { "M+": this.getMonth() + 1, / ...

  8. 在Linux上配置无线网络

    导读 iwconfig是Linux Wireless Extensions(LWE)的用户层配置工具之一.LWE是Linux下对无线网络配置的工具,包括内核的支持.用户层配置工具和驱动接口的支持三部分 ...

  9. unity3d 关于断点下载和整个下载(用于更新)

    转自:http://blog.csdn.net/yutyliu/article/details/24346459 string t = ""; //整体下载 IEnumerator ...

  10. python trackback的使用心得

    以前在读代码的时候总是要花很久时间去找在哪里调用的某个函数,现在好了,直接使用:trackback.print_stack()就可以打印出调用栈了,在那个地方调用的一目了然... 而如果是异常栈的话就 ...