矩阵每一行重复_【剑指offer】65 矩阵中的路径
-?題目描述
請(qǐng)?jiān)O(shè)計(jì)一個(gè)函數(shù),用來(lái)判斷在一個(gè)矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一個(gè)格子開始,每一步可以在矩陣中向左,向右,向上,向下移動(dòng)一個(gè)格子。如果一條路徑經(jīng)過(guò)了矩陣中的某一個(gè)格子,則該路徑不能再進(jìn)入該格子。例如下圖
矩陣中包含一條字符串"bcced"的路徑,但是矩陣中不包含"abcb"路徑,因?yàn)樽址牡谝粋€(gè)字符b占據(jù)了矩陣中的第一行第二個(gè)格子之后,路徑不能再次進(jìn)入該格子。
示例1
輸入
?"ABCESFCSADEE",3,4,"ABCCED"返回值
?true示例2
輸入
?"ABCESFCSADEE",3,4,"ABCB"返回值
?false-?解題思路
分析:回溯算法 這是一個(gè)可以用回朔法解決的典型題。首先,在矩陣中任選一個(gè)格子作為路徑的起點(diǎn)。如果路徑上的第i個(gè)字符不是ch,那么這個(gè)格子不可能處在路徑上的第i個(gè)位置。如果路徑上的第i個(gè)字符正好是ch,那么往相鄰的格子尋找路徑上的第i+1個(gè)字符。除在矩陣邊界上的格子之外,其他格子都有4個(gè)相鄰的格子。重復(fù)這個(gè)過(guò)程直到路徑上的所有字符都在矩陣中找到相應(yīng)的位置。 由于回朔法的遞歸特性,路徑可以被開成一個(gè)棧。當(dāng)在矩陣中定位了路徑中前n個(gè)字符的位置之后,在與第n個(gè)字符對(duì)應(yīng)的格子的周圍都沒(méi)有找到第n+1個(gè)字符,這個(gè)時(shí)候只要在路徑上回到第n-1個(gè)字符,重新定位第n個(gè)字符。 由于路徑不能重復(fù)進(jìn)入矩陣的格子,還需要定義和字符矩陣大小一樣的布爾值矩陣,用來(lái)標(biāo)識(shí)路徑是否已經(jīng)進(jìn)入每個(gè)格子。當(dāng)矩陣中坐標(biāo)為(row,col)的格子和路徑字符串中相應(yīng)的字符一樣時(shí),從4個(gè)相鄰的格子(row,col-1),(row-1,col),(row,col+1)以及(row+1,col)中去定位路徑字符串中下一個(gè)字符如果4個(gè)相鄰的格子都沒(méi)有匹配字符串中下一個(gè)的字符,表明當(dāng)前路徑字符串中字符在矩陣中的定位不正確,我們需要回到前一個(gè),然后重新定位?! ∫恢敝貜?fù)這個(gè)過(guò)程,直到路徑字符串上所有字符都在矩陣中找到合適的位置
-?Java實(shí)現(xiàn)
public class Solution { private final static int[][] next = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}}; private int rows; private int cols; public boolean hasPath(char[] array, int rows, int cols, char[] str) { if (rows == 0 || cols == 0) return false; this.rows = rows; this.cols = cols; boolean[][] marked = new boolean[rows][cols]; char[][] matrix = buildMatrix(array); for (int i = 0; i < rows; i++) for (int j = 0; j < cols; j++) if (backtracking(matrix, str, marked, 0, i, j)) return true; return false; } private boolean backtracking(char[][] matrix, char[] str, boolean[][] marked, int pathLen, int r, int c) { if (pathLen == str.length) return true; if (r < 0 || r >= rows || c < 0 || c >= cols || matrix[r][c] != str[pathLen] || marked[r][c]) { return false; } marked[r][c] = true; for (int[] n : next) if (backtracking(matrix, str, marked, pathLen + 1, r + n[0], c + n[1])) return true; marked[r][c] = false; return false; } private char[][] buildMatrix(char[] array) { char[][] matrix = new char[rows][cols]; for (int r = 0, idx = 0; r < rows; r++) for (int c = 0; c < cols; c++) matrix[r][c] = array[idx++]; return matrix;????}}總結(jié)
以上是生活随笔為你收集整理的矩阵每一行重复_【剑指offer】65 矩阵中的路径的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: netpbm
- 下一篇: WINCE的BIB文件解析