【附可运行代码】剑指 Offer 12. 矩阵中的路径
生活随笔
收集整理的這篇文章主要介紹了
【附可运行代码】剑指 Offer 12. 矩阵中的路径
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
立志用最少的代碼做最高效的表達
給定一個 m x n 二維字符網格 board 和一個字符串單詞 word 。如果 word 存在于網格中,返回 true ;否則,返回 false 。
單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重復使用。
例如,在下面的 3×4 的矩陣中包含單詞 “ABCCED”(單詞中的字母已標出)。
示例 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
board 和 word 僅由大小寫英文字母組成
優化過程
1、定義成員變量(全局變量),避免回溯方法用二維數組做參數,占用大量內存。
2、靈活使用剪枝,具體見代碼。
可運行代碼
// 靜態Solution public class 劍指Offer12_矩陣中的路徑 {public static class Solution {char[][] bo; // 數組boardchar[] wo; // 數組wordboolean[][] vis; // vis數組int next[][];int n, m;boolean flag = false;public boolean exist(char[][] board, String word) {// 特殊情況判斷if(board.length == 0) return false;bo = board;wo = word.toCharArray();n = bo.length; m = bo[0].length;vis = new boolean[n][m];next = new int[][]{{1,0}, {-1,0}, {0,-1},{0,1}};for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {if(wo[0] == bo[i][j]) {vis[i][j] = true;dfs(i, j, 1);vis[i][j] = false;}// 每次搜索后都判斷是否已經找到if(flag) return true;}}return false;}public void dfs(int x, int y, int k) {// 1、終止條件// k == len,終止// res 如果已經找到,則直接return(剪枝)if(k == wo.length || flag) {flag = true; return;}for(int d = 0; d < 4; d++) {int xx = x + next[d][0], yy = y + next[d][1];// 越界 or 被訪問過 or 不匹配if(xx < 0 || yy < 0 || xx >= n || yy >= m || vis[xx][yy] || bo[xx][yy]!=wo[k]) continue;vis[xx][yy] = true;dfs(xx, yy, k+1);vis[xx][yy] = false;}}}public static void main(String[] args) {Solution solution = new Solution();char[][] board = {{'a','b','c','e'},{'s','f','c','s'},{'a','d','e','e'}};String word = "abcced";System.out.println(solution.exist(board, word));} } 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的【附可运行代码】剑指 Offer 12. 矩阵中的路径的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【双百解法】剑指 Offer 11. 旋
- 下一篇: 【四重优化,速看】剑指 Offer 13