- 单词搜索
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true
示例 2:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “SEE”
输出:true
示例 3:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCB”
输出:false
提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board 和 word 仅由大小写英文字母组成
注:通过对board的遍历让每一个字母都进入回溯back,去寻找是否有满足当前条件下的子串。如果找到直接返回true,如果没找到就更换字母继续进行回溯。对于每个字母的话,有4个选择,判断其左右上下的字母是否与word中的字符对应,如果对应则继续进行寻找,不对应就直接返回false。
back中就是模拟操作,如果选择了当前字母,对于当前字母的位置的used就要变为true,如果一个字母的上下左右都不满足,则要将其used的标识进行改变为false,因为该字母还可以作为其他字母的上下左右字母被进行选择。
class Solution {
public boolean exist(char[][] board, String word) {
boolean ans = false;
int m = board.length;
int n =board[0].length;
boolean[][] used = new boolean[m][n];
System.out.println(m+" "+n);
for(int i=0;i<m;i++){
for(int j =0;j<n;j++){
boolean f = back(m,n,0,i,j,used,board,word);
if(f){
return true;
}
}
}
return false;
}
public static boolean back(int m,int n, int index, int row, int col, boolean[][] used, char[][] board, String word) {
// System.out.println(index);
if (board[row][col] != word.charAt(index)) {
return false;
}
if (index == word.length()-1) {
return true;
}
if (board[row][col] == word.charAt(index)) {
used[row][col] = true;
//左边
if (col - 1 >= 0 && !used[row][col-1]) {
if (back(m,n, index + 1, row, col - 1, used, board, word)) {
used[row][col] = false;
return true;
}
}
//右边
if (col + 1 < n && !used[row][col+1]) {
if (back(m,n, index + 1, row, col + 1, used, board, word)) {
used[row][col] = false;
return true;
}
}
//上边
if (row - 1 >= 0 && !used[row-1][col]) {
if (back(m,n, index + 1, row - 1, col, used, board, word)) {
used[row][col] = false;
return true;
}
}
//下边
if (row + 1 < m && !used[row+1][col] ) {
if (back(m,n, index + 1, row + 1, col, used, board, word)) {
used[row][col] = false;
return true;
}
}
}
used[row][col] = false;
return false;
}
}