我们先枚举单词的起点,然后依次枚举单词的每个字母。
过程中需要将已经使用过的字母改成一个特殊字母,以避免重复使用字符。
时间复杂度分析:单词起点一共有 n^2 个,单词的每个字母一共有上下左右四个方向可以选择,但由于不能走回头路,所以除了单词首字母外,仅有三种选择。所以总时间复杂度是 O(n^2*3^k)。
class Solution {
public:
bool hasPath(vector<vector<char>>& matrix, string &str) {
for (int i = 0; i < matrix.size(); ++ i)
for (int j = 0; j < matrix[i].size(); ++ j)
if (dfs(matrix, str, 0, i, j)) return true;
return false;
}
bool dfs(vector<vector<char>>& matrix, string &str, int u, int x, int y) {
if (str[u] != matrix[x][y]) return false;
if (u == str.size() - 1) return true;
int dx[4] = {0, 1, 0, -1}, dy[4] = {-1, 0, 1, 0};
char t = matrix[x][y];
matrix[x][y] = '*';
for (int i = 0; i < 4; ++ i)
{
int a = x + dx[i], b = y + dy[i];
if (a >= 0 && a < matrix.size() && b >= 0 && b < matrix[a].size())
{
if (dfs(matrix, str, u + 1, a, b)) return true;
}
}
matrix[x][y] = t;
return false;
}
};