矩阵中的路径
题目:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true
方法一:回溯
通常回溯参数为:已知条件、现有条件、状态记录。
方法分为两个部分:终止条件、递归方法
递归过程前需要更新状态,递归过程后需要恢复状态
class Solution { boolean ans = false; public boolean exist(char[][] board, String word) { char begin = word.charAt(0); char[][] visit = new char[board.length][board[0].length]; for(int i = 0; i < board.length; i++){ for(int j = 0; j < board[0].length; j++){ if(board[i][j] == begin) backtrace(board,word,i,j,0,visit); if(ans == true) return true; } } return ans; } public void backtrace(char[][] board, String word,int m, int n, int i,char[][] visit){ if(visit[m][n] == 0 && word.charAt(i) == board[m][n] && i == word.length() - 1) { ans = true; return; } if(word.charAt(i) == board[m][n]){ visit[m][n] = 1; //上下左右 if(ans == false && m - 1 >= 0 && visit[m - 1][n] == 0) backtrace(board,word,m-1,n,i+1,visit); if(ans == false && n - 1 >= 0 && visit[m][n - 1] == 0) backtrace(board,word,m,n-1,i+1,visit); if(ans == false && m + 1 < board.length && visit[m + 1][n] == 0) backtrace(board,word,m+1,n,i+1,visit); if(ans == false && n + 1 < board[0].length && visit[m][n + 1] == 0) backtrace(board,word,m,n+1,i+1,visit); visit[m][n] = 0; } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)