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(dfs(board, i , j, word, 0)){
return true;
}
}
}
return false;
}
boolean dfs(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';
//四个方向都搜索一下
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);
board[i][j] = word.charAt(k);
return res;
//时间复杂度: mn * 3^len
}
}
class Solution {
int[][] record;//记录一次dfs已经遍历过的位置
public boolean exist(char[][] board, String word) {
int m = board.length;
int n = board[0].length;
record = new int[m][n];
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(dfs(board, i, j, word, 0)){
return true;
}
}
}
return false;
}
public boolean dfs(char[][] board, int i, int j, String word, int index){
if(index == word.length()){
return true;
}
if(i < 0 || j < 0 || i >= board.length || j >= board[0].length){
return false;
}
if(record[i][j] == 1){
return false;
}
if(board[i][j] != word.charAt(index)){
return false;
}
record[i][j] = 1;
boolean up = dfs(board, i - 1, j, word, index + 1);
boolean down = dfs(board, i + 1, j, word, index + 1);
boolean left = dfs(board, i, j - 1, word, index + 1);
boolean right = dfs(board, i, j + 1, word, index + 1);
record[i][j] = 0;
return up || down || left || right;
}
}
共以下 15 个回答
class Solution {>& board, string word) {
public:
bool exist(vector<vector
//遍历每一个结点
for(int i = 0; i < board.size(); i++){
for(int j = 0; j < board[i].size(); j++){
if(dfs(board, word, 0, i, j)) return true;
}
}
return false;
}
};
第二次做了还是没有独立写出来,回溯掌握的依旧不好还要加强。
c++ 代码>& board, string word)
class Solution {
public:
int cx[4]={-1,1,0,0},cy[4]={0,0,-1,1},k=0;
bool exist(vector<vector
{
for(int i=0;i<board.size();i++)
{
for(int j=0;j<board[0].size();j++)
{
if(dfs(board,i,j,word,k))
return true;
}
}
return false;
};
回溯
”’java
class Solution {
public boolean exist(char[][] board, String word) {
//回溯算法,相邻单词连接起来
int h = board.length,w=board[0].length;
boolean[][] visited = new boolean[h][w];
for(int i = 0;i < h;i++){
for(int j = 0;j < w;j++){
boolean flag = check(board,visited,i,j,word,0);
if(flag){
return true;
}
}
}
return false;
}
}
”’
class Solution {
int n;
int m;
boolean[][] jude;
public boolean exist(char[][] board, String word) {
//回溯 用数组标记已经走过 加入结果集
//从每一个点开始
n=board.length;
m=board[0].length;
jude=new boolean[n][m];
for(int i=0;i<board.length;i++)
{
for(int j =0;j<board[0].length;j++)
{
if(backing(board,word,i,j,0))//定义k 判断word的第几位和 board(i,j)比较 相同才能走循环
{
return true;
}
}
}
return false;
if(i<0||i>=n||j<0||j>=m||board[i][j]!=word.charAt(k)||jude[i][j])
{
return false;
}
if(kword.length()-1)
{
return true;
}
jude[i][j]=true; //默认false
boolean res = backing(board,word,i+1,j,k+1)||backing(board,word,i,j+1,k+1)||backing(board,word,i-1,j,k+1)||backing(board,word,i,j-1,k+1);
}
做的比较少,思考了挺久
8.2
Day24:下面是代码