单词搜索
给定一个 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
解题思路
- 1、使用回溯算法来搜索单词在二维字符网格中的位置。
- 2、对于每个位置,尝试匹配单词的第一个字符,然后递归搜索相邻位置是否可以匹配下一个字符。
- 3、使用递归回溯的方法,搜索所有可能的路径。
Java实现
public class WordSearch {
public boolean exist(char[][] board, String word) {
int m = board.length;
int n = board[0].length;
boolean[][] visited = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (searchWord(board, word, 0, i, j, visited)) {
return true;
}
}
}
return false;
}
private boolean searchWord(char[][] board, String word, int index, int i, int j, boolean[][] visited) {
if (index == word.length()) {
return true;
}
if (i < 0 || i >= board.length || j < 0 || j >= board[0].length || visited[i][j] || board[i][j] != word.charAt(index)) {
return false;
}
visited[i][j] = true;
boolean found = searchWord(board, word, index + 1, i + 1, j, visited)
|| searchWord(board, word, index + 1, i - 1, j, visited)
|| searchWord(board, word, index + 1, i, j + 1, visited)
|| searchWord(board, word, index + 1, i, j - 1, visited);
visited[i][j] = false;
return found;
}
public static void main(String[] args) {
WordSearch solution = new WordSearch();
char[][] board = {
{'A', 'B', 'C', 'E'},
{'S', 'F', 'C', 'S'},
{'A', 'D', 'E', 'E'}
};
String word = "ABCCED";
boolean exists = solution.exist(board, word);
if (exists) {
System.out.println("Word \"" + word + "\" exists in the board.");
} else {
System.out.println("Word \"" + word + "\" does not exist in the board.");
}
}
}
时间空间复杂度
-
时间复杂度:O(N * 4^L),其中N为二维字符网格中的单元格数,L为单词的长度。因为对于每个单元格,最坏情况下需要尝试四个方向的递归搜索,单词的长度为L。
-
空间复杂度:O(L),递归调用栈的深度为单词的长度。