class Solution {
int n;
int m;
int len;
boolean[][] visited;//是否拜访过
public boolean exist(char[][] board, String word) {
this.n = board.length;
this.m = board[0].length;
this.len = word.length();
visited = new boolean[n][m];
for(int i = 0; i < n; i++){//遍历搜索
for(int j = 0; j < m; j++){
if(dsf(board, i, j, word, 0)){
return true;
}
}
}
return false;
}
boolean dsf(char[][] board, int i, int j, String word, int k){
// 判断是否越界,已经访问过或者不匹配
if(i < 0 || i >= n || j < 0 || j >= m || board[i][j] != word.charAt(k)){
return false;
}
if(k == len - 1){//匹配到最后一个字符
return true;
}
//visited[i][j] = true;
board[i][j] = '\n';//也可以不用 visited[i][j],赋一个特殊值
// 四个方向都搜索一下,右,下,左,上的 顺序
boolean res = dsf(board, i, j + 1, word, k + 1) ||
dsf(board, i + 1, j, word, k + 1) ||
dsf(board, i, j - 1, word, k + 1) ||
dsf(board, i - 1, j, word, k + 1);
//visited[i][j] = false;
board[i][j] = word.charAt(k);//赋回原来的值
return res;
// 时间复杂度:mn * 3^len
//空间:n*n
}
}
“`C++
class Solution {
public:
bool wordPuzzle(vector>& grid, string target) {
int n = grid.size();
int m = grid[0].size();
int l = target.size();
vector> visit(n, vector(m, false));
function<bool(int, int, int)> dfs = [&](int i, int j, int k) -> bool
{
if( i < 0 || i >= n || j < 0 || j >= m || visit[i][j] || grid[i][j] != target[k])
{
return false;
}
if(k == l - 1)
{
return true;
}
visit[i][j] = true;
bool res = dfs(i + 1, j, k + 1) || dfs(i, j + 1, k + 1) || dfs(i - 1, j, k + 1) || dfs(i, j - 1, k + 1);
visit[i][j] = false;
return res;
};
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(dfs(i, j, 0))
{
return true;
}
}
}
return false;
}
共以下 12 个回答
class Solution {>& grid, string target) {
public:
bool wordPuzzle(vector<vector
int n = grid.size();
int m = grid[0].size();
int l = target.size();
};
打卡
打卡
时间复杂度:mn * 3^len
空间:n*n
思路:dfs
“`c++>& grid, string target) {>& grid, string target, int idx, int row, int col) {
class Solution {
public:
bool wordPuzzle(vector
for (int i=0; i
if (idx == target.size()) return true;
if (row < 0 || row >= grid.size() || col < 0 || col >= grid[0].size() || grid[row][col] != target[idx]) return false;
grid[row][col] = ‘\0’;
if (dfs(grid, target, idx+1, row-1, col) || dfs(grid, target, idx+1, row+1, col) || dfs(grid, target, idx+1, row, col-1) || dfs(grid, target, idx+1, row, col+1)) return true;
grid[row][col] = target[idx];
return false;
}
};
“`
时间复杂度:O(nm3^len)
空间复杂度: O(n * m)
时间复杂度O(MN),空间复杂度O(MN)
“`C++>& grid, string target) {> visit(n, vector(m, false));
class Solution {
public:
bool wordPuzzle(vector
int n = grid.size();
int m = grid[0].size();
int l = target.size();
vector
};
“`
回溯体现在对visited[][]的修改
深度优先搜索
class Solution {
}
//时间复杂度(nm*3^length)
//空间复杂度O(length)
class Solution {>& grid, string target) {
public:
bool wordPuzzle(vector<vector
int m = grid.size(), n = grid[0].size();
for(int i = 0; i < m; i ++) {
for(int j = 0; j < n; j ++) {
if(dfs(grid, target, i, j, 0)) return true;
}
}
return false;
}
private:
};
时间复杂度O(3^KMN) 空间复杂度O(K)