[LeetCode][Word Search]思路没错,写法大误

在LeetCode中解决Word Search问题时,最初使用暴力DFS方法导致超时。错误在于分别尝试了四个方向,而实际上只需要一个方向成功即可。将四个if条件改为逻辑或操作符后,代码AC并超过90%提交,优化后的复杂度从4^n降至2^n,显著提升了效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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很大,运行次数会极为大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值