题目链接:点击打开链接
题目大意:略
解题思路:略
相关企业
- 字节跳动
- 亚马逊(Amazon)
- 微软(Microsoft)
- 推特(Twitter)
- 彭博(Bloomberg)
- 优步(Uber)
- 思科(Cisco)
- 谷歌(Google)
- 苹果(Apple)
AC 代码
- Java
// 解决方案(1)
class Solution {
// 使用 Map 超时
// private Map<Integer, Boolean> usedMap = new HashMap<>();
private boolean ok = false;
private boolean[][] path;
public boolean exist(char[][] board, String word) {
path = new boolean[board.length][board[0].length];
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[i].length; j++) {
if (ok) {
return true;
}
// usedMap.clear();
// 不需要每次都初始化, 比较耗时, 因为回溯的时候会恢复到原始状态
// path = new boolean[board.length][board[0].length];
handle(board, i, j, word, 0);
}
}
return ok;
}
private void handle(char[][] board, int i, int j, String word, int ptr) {
if (ok || i >= board.length || i < 0 || j >= board[0].length || j < 0) {
return;
}
// Integer key = i * 10 + j;
if (path[i][j]) {
return;
}
if (board[i][j] == word.charAt(ptr)) {
if (ptr + 1 >= word.length()) {
ok = true;
return;
}
path[i][j] = true;
// usedMap.put(key, true);
handle(board, i + 1, j, word, ptr + 1);
handle(board, i - 1, j, word, ptr + 1);
handle(board, i, j + 1, word, ptr + 1);
handle(board, i, j - 1, word, ptr + 1);
// usedMap.remove(key);
path[i][j] = false;
}
}
}
// 解决方案(2)
class Solution {
public boolean exist(char[][] board, String word) {
char[] words = word.toCharArray();
for(int i = 0; i < board.length; i++) {
for(int j = 0; j < board[0].length; j++) {
if(dfs(board, words, i, j, 0)) return true;
}
}
return false;
}
boolean dfs(char[][] board, char[] word, int i, int j, int k) {
if(i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != word[k]) return false;
if(k == word.length - 1) return true;
board[i][j] = '\0';
boolean res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) ||
dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i , j - 1, k + 1);
board[i][j] = word[k];
return res;
}
}
- C++
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
rows = board.size();
cols = board[0].size();
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
if(dfs(board, word, i, j, 0)) return true;
}
}
return false;
}
private:
int rows, cols;
bool dfs(vector<vector<char>>& board, string word, int i, int j, int k) {
if(i >= rows || i < 0 || j >= cols || j < 0 || board[i][j] != word[k]) return false;
if(k == word.size() - 1) return true;
board[i][j] = '\0';
bool res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) ||
dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i , j - 1, k + 1);
board[i][j] = word[k];
return res;
}
};