Word Search
今天练习了一道leetcode,一看,就是暴力解法就行了嗷,利用DFS的思想遍历遍历,从四个方向进发。
然后我真的从四个方向都出发了,结果运行显然就超时了。以下为超时代码
class leetCode79 {
public static void main(String[] args) {
char[][] a = {{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a'},{'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','b'}};
System.out.println(exist(a, "baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
}
public static boolean exist(char[][] board, String word) {
if (board.length == 0) {
return false;
}
boolean[][] visited = new boolean[board.length][board[0].length];
char[] chars = word.toCharArray();
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (exist(board, i, j, chars, 0, visited)) {
return true;
}
visited[i][j] = false;
}
}
return false;
}
public static boolean exist(char[][] board, int x, int y, char[] chars, int pos, boolean[][] visited) {
if (x >= board.length || y >= board[0].length || x < 0 || y < 0) {
return false;
}
if (visited[x][y]) {
return false;
}
if (board[x][y] != chars[pos]) {
return false;
}
if (pos == chars.length - 1) {
return true;
}
visited[x][y] = true;
boolean flag = false;
if (exist(board, x - 1, y, chars, pos + 1, visited)) {
flag = true;
}
if (exist(board, x + 1, y, chars, pos + 1, visited)) {
flag = true;
}
if (exist(board, x, y + 1, chars, pos + 1, visited)) {
flag = true;
}
if (exist(board, x, y - 1, chars, pos + 1, visited)) {
flag = true;
}
visited[x][y] = false;
return flag;
}
}
错就错在我是个憨憨,真的从四个方向都走了一遍,其实只要有一个方向通了,都行嗷。
把四个if换成 || 连接就行了。
if (exist(board, x - 1, y, chars, pos + 1, visited) || exist(board, x + 1, y, chars, pos + 1, visited) ||exist(board, x, y + 1, chars, pos + 1, visited)||exist(board, x, y - 1, chars, pos + 1, visited)) {
flag = true;
}
所以说呢,改动之后就AC了,还超过了百分之90多,基本上没啥问题了。
算算 平均2次能找到的话,那么错误解法的复杂度就是4的n次方,正确解法就是2的n次方。。。。错误解法的运行次数是正确解法的平方次。一旦n很大,运行次数会极为大。