劍指offer面試題12:矩陣中的路徑(Java版已在牛客網AC)
題目
請設計一個函式,用來判斷在一個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則之後不能再次進入這個格子。 例如下面的3*4矩陣中包含一條字串“bfce”的路徑,但是矩陣中不包含"abfb"路徑,因為字串的第一個字元b佔據了矩陣中的第一行第二個格子之後,路徑不能再次進入該格子。
a b t g
c f c s
j d e h
思路
這是一個典型的回溯法應用例項,以題目中的例子為例:
- 首先在矩陣中任意選擇一個字元ch1作為起點,然後和待查詢的字串中的第i個字元進行比較
- 如果不相等,則繼續遍歷矩陣中ch1緊挨著的下一個元素
- 如果相等,則對ch1周圍的其他方向進行查詢和待查詢的字串中地i+1個字元相等的字元
- 重複上述過程直到待查詢的字串的每一個字元都在矩陣中找到,如果在矩陣中找到了待查詢的字串的前n個字元的位置後,在第n個字元的位置周圍無法找到待查詢字串的第n+1個字元,則需要回退到第n-1個字元的位置上重新選擇方向進行查詢。
注意
- 除了矩陣邊界的格子外,其他格子都有4個相鄰的格子分別代表著相應的方向
- 在該演算法中須有一個標誌陣列,用來標誌已經走過的路
- 標誌陣列中標記走過的格子不能再訪問
程式碼實現
//matrix是一個一維陣列但用來表示二維的矩陣,是不是想問為啥不直接用二維陣列
//博主也想用二維陣列來表示矩陣,但是牛客網上給的引數就一維陣列,博主也很無奈
//row表示矩陣的行數 cols表示矩陣的列數 str表示的是帶查詢的字串
public boolean hasPath(char[] matrix, int rows, int cols, char[] str)
{
if(matrix==null||rows<1||cols<1||str==null)
{
return false;
}
//visted是一個標誌陣列用來標誌哪些格子已經被訪問過
boolean[] visted=new boolean[rows*cols];
//初始化標誌陣列
for(int i=0;i<visted.length;i++)
{
visted[i]=false;
}
//用來表示待查詢字串在矩陣中已經找到的字元個數
Integer pathLength=0;
//雙重迴圈用來遍歷矩陣尋找待查詢字串的第一個字元 row表示矩陣的當前行數
//col表示矩陣當前的列數
for(int row=0;row<rows;row++)
{
for(int col=0;col<cols;col++)
{
//遞迴查詢待查詢的字串在矩陣中是否存在
if(hasPathCore(matrix,rows,cols,row,col,str,pathLength,visted))
{
return true;
}
}
}
return false;
}
private boolean hasPathCore(char[] matrix,int rows,int cols,int row,int col,char[] str,Integer pathLength,boolean[] visited)
{
//如果待查詢的字串的所有字元都在矩陣中找到
if(pathLength==str.length)
{
return true;
}
//用來表示在在矩陣中的某一個格子附近是否還能找到待查詢字串的下一個字元
boolean hasPath=false;
//如果矩陣當前格子的位置的字元等於待查詢字串的下一個字元
if(row>=0&&row<rows&&col>=0&&col<cols&&matrix[row*cols+col]==str[pathLength]&&!visited[row*cols+col])
{
++pathLength;
visited[row*cols+col]=true;
//繼續在該位置的其他方向進行尋找下一個字元
//左
hasPath=hasPathCore(matrix,rows,cols,row,col-1,str,pathLength,visited)
//上
||hasPathCore(matrix,rows,cols,row-1,col,str,pathLength,visited)
//右
||hasPathCore(matrix,rows,cols,row,col+1,str,pathLength,visited)
//下
||hasPathCore(matrix,rows,cols,row+1,col,str,pathLength,visited);
//如果在某個位置上找不到待查詢字串的下一個字元
if(!hasPath)
{
//回退到上一個位置
--pathLength;
visited[row*cols+col]=false;
}
}
return hasPath;
}
相關文章
- 劍指offer面試題11:旋轉陣列的最小數字(Java版已在牛客網AC)面試題陣列Java
- 劍指offer:JZ12 矩陣中的路徑矩陣
- 《劍指offer》:[66]矩陣中的路徑矩陣
- 劍指 Offer 12-矩陣中的路徑c++矩陣C++
- 力扣 - 劍指 Offer 12. 矩陣中的路徑力扣矩陣
- 用 Go 劍指 Offer 12. 矩陣中的路徑 (DFS + 回溯)Go矩陣
- 二維陣列中的查詢——牛客劍指offer陣列
- 劍指offer面試題29:順時針列印矩陣面試題矩陣
- 劍指offer(java實現)第4題“重建二叉樹”-牛客網Java二叉樹
- 【劍指offer】順時針列印矩陣矩陣
- [劍指offer] JAVA版題解(完整版)更新中。。。Java
- 劍指offer(java實現)第3題“從尾到頭列印連結串列”-牛客網Java
- 劍指offer(java實現)第5題“用兩個棧實現佇列”-牛客網Java佇列
- 劍指offer-19:順時針列印矩陣矩陣
- 牛客刷題回溯法之矩陣中的路徑 and 機器人的運動範圍矩陣機器人
- 劍指offer面試題(41-50)——java實現面試題Java
- 【劍指offer】陣列中的逆序對陣列
- 矩陣中的路徑矩陣
- 劍指offer面試題12 列印1到最大的n位數面試題
- 劍指Offer面試題5(Java版):從尾到頭列印連結串列面試題Java
- 劍指 Offer 29-順時針列印矩陣c++矩陣C++
- 力扣 - 劍指 Offer 29. 順時針列印矩陣力扣矩陣
- 劍指 offer 第一題: 二維陣列中的查詢陣列
- 【劍指offer】二維陣列中的查詢陣列
- GitHub#algorithm#:《劍指offer》 的50道面試題GithubGo面試題
- 劍指 Offer 34. 二叉樹中和為某一值的路徑(java解題)二叉樹Java
- 劍指Offer-37-陣列中逆序對陣列
- 「劍指offer」27道Mybatis面試題含解析MyBatis面試題
- 劍指offer-JavaScript版JavaScript
- 劍指 offer(1) -- 陣列篇陣列
- 劍指Offer--陣列中重複的數字陣列
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- 【劍指offer】【1】二維陣列中的查詢陣列
- 《劍指offer》:[51]陣列中的重複數字陣列
- 劍指offer面試題11 數值的整數次方面試題
- 劍指offer刷題之路--1.陣列中重複的數字陣列
- 劍指Offer題解合集
- 劍指Offer——面試小提示(持續更新中)面試