“`java
class Solution {
int m;
int n;
boolean[][] visited;
public boolean wordPuzzle(char[][] grid, String target) {
if (grid == null || grid.length == 0) {
return false;
}
m = grid.length;
n = grid[0].length;
visited = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
boolean flag = exists(grid, visited, i, j, target, 0);
if (flag) {
return true;
}
}
}
return false;
}
public boolean exists(char[][] grid, boolean[][] visited, int i, int j, String target, int k) {
if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] != target.charAt(k) || visited[i][j]) {
return false;
} else if (k == target.length() - 1){
return true;
}
visited[i][j] = true;
//上下左右去找
boolean result = exists(grid, visited, i - 1, j, target, k + 1) || exists(grid, visited, i + 1, j, target, k + 1)
|| exists(grid, visited, i, j - 1, target, k + 1) || exists(grid, visited, i, j + 1, target, k + 1);
visited[i][j] = false;
return result;
}
public class Solution {
int m,n,len;
public boolean exist(char[][] board, String word) {
this.m = board.length;
this.n = board[0].length;
this.len = word.length();
for (int i = 0;i < m;i++){
for (int j = 0;j < n;j++){
if (dfs(board,word,0,i,j)) return true;
}
}
return false;
}
public boolean dfs(char[][] board, String word, int index,int i, int j){
if (board[i][j] != word.charAt(index)){
return false;
}
if (index == len - 1) return true;
//直接利用board数组判断是否走过
//能到这一步说明board[i][j] == word.charAt(index),恢复时就这么恢复
board[i][j] = '.';
// ||保证了前面为true后,后面不执行
if(j + 1 < n){
if (dfs(board, word, index +1, i, j + 1)) return true;
}
if (i + 1 < m){
if (dfs(board, word, index +1, i + 1, j)) return true;
}
if (j - 1 >= 0){
if (dfs(board, word, index +1, i, j - 1)) return true;
}
if (i - 1 >= 0){
if (dfs(board, word, index +1, i - 1, j)) return true;
}
board[i][j] = word.charAt(index);
return false;
}
}
“`C++
bool backtrack(vector>& board, int row, int col, string& word, int index) {
// 如果已经找到了单词的末尾,说明匹配成功
if (index == word.size()) {
return true;
}
int m = board.size();
int n = board[0].size();
// 如果当前单元格的位置越界或字母不匹配,则返回 false
if (row < 0 || row >= m || col < 0 || col >= n || board[row][col] != word[index]) {
return false;
}
// 将当前单元格标记为已访问
char temp = board[row][col];
board[row][col] = '*';
// 在上、下、左、右四个方向上继续匹配下一个字母
bool result = backtrack(board, row - 1, col, word, index + 1) ||
backtrack(board, row + 1, col, word, index + 1) ||
backtrack(board, row, col - 1, word, index + 1) ||
backtrack(board, row, col + 1, word, index + 1);
// 还原当前单元格,并返回结果
board[row][col] = temp;
return result;
}
bool exist(std::vector<std::vector>& board, std::string word) {
int m = board.size();
int n = board[0].size();
// 遍历二维字符网格的每一个单元格,作为起点开始搜索匹配单词
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (backtrack(board, i, j, word, 0)) {
return true;
}
}
}
return false;
class Solution {
int count=0;
boolean[][] visited;
public int movingCount(int m, int n, int k) {
visited = new boolean[m][n];
dfs(0, 0, m, n, k);
return count;
}
public void dfs(int row, int col, int m, int n, int k){
if(row<0 || row>=m || col<0 || col>=n) return;
if(row/10 + row%10 + col/10 + col%10 > k) return;
if(visited[row][col]) return;
count++;
visited[row][col]=true;
dfs(row, col+1, m, n, k);
dfs(row+1, col, m, n, k);
dfs(row, col-1, m, n, k);
dfs(row-1, col, m, n, k);
}
}
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
m, n = len(board), len(board[0])
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]
visited = [[0] * n for _ in range(m)]
def backtrack(i, j, pos):
if pos >= len(word):
return True
if i >= m or i < 0 or j >= n or j < 0 or word[pos] != board[i][j]:
return False
if visited[i][j] == 1:
return False
visited[i][j] = 1
for dx, dy in directions:
nx, ny = i + dx, j + dy
if backtrack(nx, ny, pos + 1):
return True
visited[i][j] = 0
return False
for i in range(m):
for j in range(n):
if backtrack(i, j, 0):
return True
return False
int m,n;
int[][] directions = {{1,0},{-1,0},{0,1},{0,-1}};
boolean[][] visited;
public boolean exist(char[][] board, String word) {
m = board.length;
n = board[0].length;
visited = new boolean[m][n];
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(dfs(board, word, i, j, 0)) return true;
}
}
return false;
}
private boolean dfs(char[][] board, String word, int i, int j, int index){
if(board[i][j] != word.charAt(index) ) return false;
if(index == word.length()-1){
return true;
}
visited[i][j] = true;
for(int[] d : directions){
int x = i + d[0];
int y = j + d[1];
if(x < 0 || x >= m || y < 0 || y >= n) continue;
if(visited[x][y]) continue;
if(dfs(board, word, x, y, index+1)) return true;
}
visited[i][j] = false;
return false;
}
共以下 17 个回答
“`java
class Solution {
int m;
int n;
boolean[][] visited;
public boolean wordPuzzle(char[][] grid, String target) {
if (grid == null || grid.length == 0) {
return false;
}
m = grid.length;
n = grid[0].length;
visited = new boolean[m][n];
for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { boolean flag = exists(grid, visited, i, j, target, 0); if (flag) { return true; } } } return false; }
}
在递归过程提前判断i、j是否合法,可以减少每次进入递归时的需要判断的次数,略微加快速度;
用||的话也很精妙,前面为true了后面也不会执行了。
“`java=m||j<0||j>=n||word.charAt(k)!=board[i][j]||visited[i][j]==true){
class Solution {
int m,n,len;
boolean[][] visited;
public boolean exist(char[][] board, String word) {
m = board.length;
n = board[0].length;
len = word.length();
visited = new boolean[m][n];
for(int i=0;i
return false;
}
if(k==len-1){
return true;
}
visited[i][j]=true;
boolean res = (dfs(board,i,j+1,word,k+1)||
dfs(board,i+1,j,word,k+1)||
dfs(board,i,j-1,word,k+1)||
dfs(board,i-1,j,word,k+1));
visited[i][j]=false;
return res;
}
}
累
时间复杂度是O(3k次幂*MN), MN个起点,3的k次幂路径选择, 空间复杂度是O(K), k次递归占用的空间
时间复杂度:O(mn)
空间复杂度::O(mn)
“`C++>& board, int row, int col, string& word, int index) {
bool backtrack(vector
// 如果已经找到了单词的末尾,说明匹配成功
if (index == word.size()) {
return true;
}
int m = board.size();
int n = board[0].size();
// 如果当前单元格的位置越界或字母不匹配,则返回 false
if (row < 0 || row >= m || col < 0 || col >= n || board[row][col] != word[index]) {
return false;
}
}
bool exist(std::vector<std::vector>& board, std::string word) {
int m = board.size();
int n = board[0].size();
}
“`
【思路】回溯,
【复杂度】时间复杂度O(mn),空间复杂度O(mn)
思路:回溯算法,DFS深度优先
时间复杂度O(mn) 空间复杂度O(mn)
检查是否符合以及是否重复走过
典型的回溯法
MY时间复杂度:O(n)
空间复杂度:O(n)
dfs+回溯
时间复杂度O(3^K*MN)