栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

79. 单词搜索 (回溯)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

79. 单词搜索 (回溯)

class Solution {
    // 二维数组长
    int n;
    // 宽
    int m;
    // 字符串长度
    int len;
    // 将字符串转换成字符数组
    char[] letters;
    // 二维数组元素是否被访问过
    boolean[][] visited;
    char[][] board;
    public boolean exist(char[][] board, String word) {
        this.n = board.length;
        this.m = board[0].length;
        this.len = word.length();
        this.board = board;
        // 初始化布尔值
        this.visited = new boolean[n][m];
        this.letters = word.toCharArray();
        // 遍历二维数组所有元素
        for(int i = 0;i < n;i++){
            for(int j = 0;j < m;j++){
                // 每个元素都要递归
                boolean res = search(i,j,0);
                if(res) return true;
            }
        }
        // 找不齐元素返回false
        return false;
    }
    // 回溯方法
    public boolean search(int i,int j,int k){
        // 字符数组的下标大于等于字符串长度,返回true
        if(k >= len) return true;
        // 当行坐标或列坐标越界,或字符数组当前状态不相等或二维数组中当前元素被访问过,返回false,属于剪枝
        if(i < 0 || j < 0 || i >=n || j >= m || letters[k] != board[i][j] || visited[i][j]) return false;
        // 当前轮访问过的元素标记为true
        visited[i][j] = true;
        // 每个元素按上下左右四个方向回溯,记录结果的布尔值
        boolean res = search(i + 1,j,k + 1) || search(i,j + 1,k + 1) || search(i - 1,j,k + 1) || search(i,j - 1,k + 1);
        // 当前元素的当前轮二维数组中所有元素遍历完后,将当前元素重新置为false,避免影响下一个元素在遍历数组时回溯时的检查
        visited[i][j] = false;
        return res;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/630147.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号