力扣练习——36 单词搜索
1.问题描述
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false
可使用以下main函数:
int main()
{
vector<vector<char> > board;
string word;
int m,n;
cin>>m;
cin>>n;
char ch;
for(int i=0; i<m; i++)
{
vector<char> aLine;
for(int j=0; j<n; j++)
{
cin>>ch;
aLine.push_back(ch);
}
board.push_back(aLine);
}
cin>>word;
bool res=Solution().exist(board,word);
cout<<(res?"true":"false")<<endl;
return 0;
}
2.输入说明
首先输入board的行数m、列数n,
然后输入m行,每行n个大写或小写英文字母。
最后输入一个单词word,长度在1到100之间,只包含大写和小写英文字母。
1 <= m <= 80
1 <= n <= 80
3.输出说明
输出true或false
4.范例
输入
3 4
ABCE
SFCS
ADEE
ABCCED
输出
true
5.代码
#include<iostream> #include<algorithm> #include<string> #include<vector> using namespace std; //回溯 //board为给定的字符矩阵,map记录当前字符是否访问过,word用来表示目标字符串,index表示当前访问的word下标 bool backtrack(vector<vector<char>>& board, vector<vector<int>>& map, string word, int i, int j, int index) { //判断下标是否正常,是否已经遍历过,对应的字符是否匹配 if (i < 0 || i == board.size() || j < 0 || j == board[0].size() || map[i][j] || board[i][j] != word[index]) return false; //遍历到字符串word结尾,并且对应的字符依然匹配 if (index == word.size() - 1 && word[index] == board[i][j]) return true; map[i][j] = 1;//标记该位置已经访问过 //进行上下左右四个方位相邻点的访问 if (backtrack(board, map, word, i, j - 1, index + 1) || backtrack(board, map, word, i - 1, j, index + 1) || backtrack(board, map, word, i, j + 1, index + 1) || backtrack(board, map, word, i + 1, j, index + 1)) return true; //回溯到上一种情况 map[i][j] = 0; return false; } bool exist(vector<vector<char> > &board, string word) { int row = board.size();//行数 int column = board[0].size();//列数 //注意二维数组的初始化方法 vector<vector<int> >map(row, vector<int>(column,0));//定义访问map初始值均为0 for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { if (backtrack(board, map, word, i, j, 0)) return true; } } return false; } int main() { vector<vector<char> > board; string word; int m, n; cin >> m; cin >> n; char ch; for (int i = 0; i < m; i++) { vector<char> aLine; for (int j = 0; j < n; j++) { cin >> ch; aLine.push_back(ch); } board.push_back(aLine); } cin >> word; bool res = exist(board, word); cout << (res ? "true" : "false") << endl; return 0; }

浙公网安备 33010602011771号