关于java:LeetCode–矩阵中的路径

3次阅读

共计 1644 个字符,预计需要花费 5 分钟才能阅读完成。

LeetCode–矩阵中的门路

<!– more –>

博客阐明

文章所波及的材料来自互联网整顿和集体总结,意在于集体学习和教训汇总,如有什么中央侵权,请分割自己删除,谢谢!

介绍

剑指 Offer 12. 矩阵中的门路

主站 79

题目

请设计一个函数,用来判断在一个矩阵中是否存在一条蕴含某字符串所有字符的门路。门路能够从矩阵中的任意一格开始,每一步能够在矩阵中向左、右、上、下挪动一格。如果一条门路通过了矩阵的某一格,那么该门路不能再次进入该格子。例如,在上面的 3×4 的矩阵中蕴含一条字符串“bfce”的门路(门路中的字母用加粗标出)。

[[“a”,”b”,”c”,”e”],
[“s”,”f”,”c”,”s”],
[“a”,”d”,”e”,”e”]]

但矩阵中不蕴含字符串“abfb”的门路,因为字符串的第一个字符 b 占据了矩阵中的第一行第二个格子之后,门路不能再次进入这个格子。

示例 1:
 输出:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输入:true
示例 2:
 输出:board = [["a","b"],["c","d"]], word = "abcd"
输入:false
提醒:
1 <= board.length <= 200
1 <= board[i].length <= 200

思路

作者:jyd

深度优先搜寻(DFS)+ 剪枝

深度优先搜寻 :能够了解为暴力法遍历矩阵中所有字符串可能性。DFS 通过递归,先朝一个方向搜到底,再回溯至上个节点,沿另一个方向搜寻,以此类推。

剪枝 :在搜寻中,遇到 这条路不可能和指标字符串匹配胜利 的状况(例如:此矩阵元素和指标字符不同、此元素已被拜访),则应立即返回,称之为 可行性剪枝。

步骤

递归参数

以后元素在矩阵 board 中的行列索引 i 和 j,以后指标字符在 word 中的索引 k。

终止条件

返回 falsefalse:① 行或列索引越界 或 ② 以后矩阵元素与指标字符不同 或 ③ 以后矩阵元素已拜访过(③ 可合并至 ②)。

返回 truetrue:字符串 word 已全副匹配,即 k = len(word) – 1。

递推工作

  • 标记以后矩阵元素:将 boardi 值暂存于变量 tmp,并批改为字符 ‘/’,代表此元素已拜访过,避免之后搜寻时反复拜访。
  • 搜寻下一单元格:朝以后元素的 上、下、左、右 四个方向开启上层递归,应用 或 连贯(代表只需一条可行门路),并记录后果至 res。
  • 还原以后矩阵元素:将 tmp 暂存值还原至 boardi 元素。

回溯返回值

返回 res,代表是否搜寻到指标字符串。

代码

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;}
        char tmp = board[i][j];
        board[i][j] = '/';
        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] = tmp;
        return res;
    }
}

感激

Leetcode

以及勤奋的本人,集体博客,GitHub

正文完
 0