给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]
给定 word = “ABCCED”, 返回 true.
给定 word = “SEE”, 返回 true.
给定 word = “ABCB”, 返回 false.
解析:本题仍然是一道回溯题。不过是从一维转换成了二维
我们定义函数,其功能是将指定网格坐标点的字符与指定字符串位置的字符进行比较,
如果相同进行递归调用,不相同则返回false
如果指定字符串字符位置到达末尾,则返回true
剩下就是处理二维网格的边界问题了。
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
for(int i=0;i<board.size();++i){
for(int j=0;j<board[0].size();++j){
if(findnext(board,i,j,word,0)) return true; //对每一个字符开始一次查找
}
}
return false;
}
bool findnext(vector<vector<char>>& board,int i,int j,string& word,int p){
if(p==word.size()) return true; //匹配完成返回true
if(i<0||j<0||i>=board.size()||j>=board[0].size()) return false; //超过边界返回false
if(board[i][j]!=word[p]) return false; //字符不相同返回false
char tmp = board[i][j]; //暂存当前字符
board[i][j] = '*'; //用随便一个不会出现的字符来替换原字符
bool res = findnext(board,i+1,j,word,p+1)||findnext(board,i,j+1,word,p+1)
||findnext(board,i-1,j,word,p+1)||findnext(board,i,j-1,word,p+1); //对四个方向进行递归调用
board[i][j] = tmp; //恢复当前字符
return res; //返回结果
}
};