方法一:模拟遍历矩阵:时间O( 3 k 3^{k} 3kmn),空间O(mn)
k:字符串长度,m、n:矩阵的长和宽
时间复杂度: 每个位置都有三个方向可以走(不能走回头路),因此时间 3 k 3^{k} 3k。矩阵的每个位置都应该检查是否正确,因此时间 m*n
题解:
- 遍历整个矩阵,若满足条件则模拟走上下左右位置,看是否有路径满足
- 不能走回头路,因此每次都把board中走过的路标记一下,在回溯的时候应该恢复上次状态
- 注意结束条件
class Solution {
public:
bool Ritway(vector<vector<char>>& board, string& word, int i, int j, int index)
{
if (i < 0 || i == board.size() || j < 0 || j == board[0].size() || board[i][j] != word[index])
return false;
if (index == word.size() - 1)
return true;
// 关键就是这里设置已经走过的路径!!不需要新建一个board保存走过的路径,在原始棋盘上更改就行了
board[i][j] = '\0';
// 判断上下左右是否有正确路径
bool flag = Ritway(board, word, i - 1, j, index + 1) ||
Ritway(board, word, i + 1, j, index + 1) ||
Ritway(board, word, i, j - 1, index + 1) ||
Ritway(board, word, i, j + 1, index + 1);
// 在检测完该条路径之后,应该恢复原始棋盘的样子
board[i][j] = word[index];
return flag;
}
bool exist(vector<vector<char>>& board, string word)
{
if (word.size() == 0)
return false;
for (int i = 0; i < board.size(); i++)
{
for (int j = 0; j < board[0].size(); j++)
{
if (Ritway(board, word, i, j, 0))
{
return true;
}
}
}
return false;
}
};