矩阵中的路径
个人博客
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的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
题解
-
回溯法
M,N 分别为矩阵行列大小, KK 为字符串
word
长度。-
时间复杂度:M*N忽略
O ( 3 K ) O(3^K) O(3K) -
空间复杂度:O(K)
-
思路:深度优先搜索,当不成立的时候返回上一个选项,然后走其他的路子
-
忽略的条件:
- 重复使用矩阵中的字符串
class Solution { private int boderWidth; private int boderHigh; public boolean exist(char[][] board, String word) { boderWidth = board[0].length -1; boderHigh = board.length - 1 ; for(int i = 0; i <= boderHigh; i++){ for(int j = 0; j <= boderWidth; j++){ if(findChar(j,i,word,board)){ return true; } } } return false; } boolean findChar(int width,int high,String word,char[][] board){ if(width < 0 || width > boderWidth || high < 0 || high > boderHigh || board[high][width] == '-' || board[high][width] != word.charAt(0)){ return false; }else{ if(word.length() == 1){ return true; }else{ char temp = board[high][width]; board[high][width] = '-'; word = word.substring(1,word.length()); boolean res = findChar(width - 1, high ,word,board) || findChar(width + 1, high ,word,board) || findChar(width,high+1,word,board) || findChar(width,high - 1,word,board); board[high][width] = temp; return res; } } } }
-
总结
这道题花了很多时间,有一个bug是因为传递参数中出现了数组共享,导致了意想不到的结果。在传递数组的时候需要注意是否会造成数组共享