Word Search
Given a 2D board and a word, find if the word exists in the grid.
The word can 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.
For example,
Givenboard=
[
["ABCE"],
["SFCS"],
["ADEE"]
]
word="ABCCED"
,
-> returnstrue
,word="SEE"
,
-> returnstrue
,word="ABCB"
,
-> returnsfalse
.这道题乍一看,有够难的题目了。不过思想又是一条分支递归回溯法,对这个方法熟悉的就不难了。
是条繁题,情况多,要理清也不容易。
这些题目思路稍微有一点乱就会如乱麻一般难以解开,如果面试遇上这样的题目,又紧张的话,那么会惨啦。
一定要注意利用一切手段理清自己的思路:画图,画表,一个判断一个判断,一个问题一个问题地解决。
本题卡住的一个知识点:离散数学的逻辑判断没写好,判断错误,结果就错误了。当遇上要连接两个判断条件的时候就要非常小心,运用好离散数学的知识。
下面程序注释的很详细了。
class Solution {
public:
bool exist(vector<vector<char> > &board, string word)
{
if (board.empty() && word.empty()) return true;
else if (board.empty()) return false;
int row = board.size(), col = board[0].size();
vector<vector<bool> > table(row, vector<bool>(col));
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if(onePosTest(board,table, word, 0, i, j))
return true;
}
}
return false;
}
bool onePosTest(vector<vector<char> > &board, vector<vector<bool> > &table,
string &word, int w_start, int i, int j)
{
//注意:判断顺序不能乱
//情况1:超界,返回
if (i>=board.size() || i <0 || j<0 || j>=board[0].size()) return false;
//情况3:不相等,或者遍历过了的点,重置table,返回false
if (table[i][j] || board[i][j] != word[w_start]) return false;
//情况2:相等且没遍历过的点,置table标志位真
table[i][j] = true;
//情况4:找到,结束,返回真
if (w_start == word.size()-1) return true;
//分支递归:
if (onePosTest(board, table, word, w_start+1, i, j+1)
|| onePosTest(board, table, word, w_start+1, i+1, j)
|| onePosTest(board, table, word, w_start+1, i-1, j)
|| onePosTest(board, table, word, w_start+1, i, j-1))
{
return true;
}
table[i][j] = false;
return false;
}
};
O(1)空间复杂度:
//2014-2-12 update
bool exist(vector<vector<char> > &board, string word)
{
if (board.empty() || board[0].empty()) return false;
for (int i = 0; i < board.size(); i++)
for (int j = 0; j < board[0].size(); j++)
if (help(board, i, j, word)) return true;
return false;
}
bool help(vector<vector<char> > &board, int row, int col,
string &word, int begin = 0)
{
if (begin == word.size()) return true;
if (row<0 || row>=board.size() || col<0 || col>=board[0].size()
|| board[row][col] != word[begin]) return false;
char t = board[row][col];
board[row][col] = '*';
if (help(board, row+1, col, word, begin+1)
|| help(board, row, col+1, word, begin+1)
|| help(board, row-1, col, word, begin+1)
|| help(board, row, col-1, word, begin+1))
return true;
board[row][col] = t;
return false;
}
分享到:
相关推荐
leetcode刷题 LeetCode 1500道 单词接龙 Python3
c++ c++_c++编程基础之leetcode题解第79题单词搜索
单词搜索 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些...
692. 前K个高频单词// 堆顶放频率最低,字典序更小的// map 每个单词的出现频率// n 为前几个, 堆的长度// 堆 数组// 堆的最大长度是n;v
Search是一个工作流插件,用于使用自定义选项搜索算法问题。 1.下载 您可以在 . 2. 用法 2.1 一般搜索 在 LeetCode 中尝试使用关键字lc进行一般搜索。 只需简单地输入您的查询。 您还可以输入-e 、 -m和-h来指定简单...
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。示例 2:输入:输出:
title: "[0820] 单词的压缩编码"题目描述给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。对于每一个索引,我们可以通过
给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 "#
刷LeetCode刷LeetCode刷LeetCode刷LeetCode刷LeetCode
leetcode上的题目,网站上测试通过,可以借鉴下
题目来自LeetCode,链接:拼写单词。具体描述为:给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串)chars。假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),...
Leetcode竞赛排名搜索器 网站: : Leetcode比赛官方排名页面缺少高级搜索/过滤功能。 所以我实现了一个! 特征: 搜索用户竞赛排名历史 按用户名和国家/地区过滤排名数据 通过使用Github Actions设置排定的...
leetcode中文版
leetcode 不会词搜索 给定一个 2D 板和一个单词,查找该单词是否存在于网格中。 单词可以由顺序相邻的单元格的字母构成,其中“相邻”单元格是水平或垂直相邻的单元格。 同一个字母单元格不能多次使用。 Example: ...
vs code LeetCode 插件
python python_leetcode面试题解之第79题单词搜索_题解
100个leetCode详细解答