日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【附可运行代码】剑指 Offer 12. 矩阵中的路径

發布時間:2024/2/28 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【附可运行代码】剑指 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、靈活使用剪枝,具體見代碼。

public 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;}}}

可運行代碼

// 靜態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. 矩阵中的路径的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。