给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board =
[
[‘A‘,‘B‘,‘C‘,‘E‘],
[‘S‘,‘F‘,‘C‘,‘S‘],
[‘A‘,‘D‘,‘E‘,‘E‘]
]
给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
题意:在矩阵中,相邻的元素可以是上、下、左、右的元素。同时要求矩阵中的同一个字符不能重复匹配。
思路:使用DFS遍历矩阵,直到遍历完字符串,说明匹配。但是需要记录矩阵中哪个字符是已经匹配过的。
由于英文字符范围是0~127,因此遍历某个字符后,进行c^=128操作,该字符在后续匹配中就不会再次
匹配到,从而实现标记的效果。在回溯的时候需要将标记的字符还原。
1 import java.util.*; 2 3 public class Solution{ 4 public boolean exist(char[][] board,String word){ 5 for(int i=0;i<board.length;i++){ 6 for(int j=0;j<board[0].length;j++){ 7 if(exist(board,i,j,word,0)) 8 return true; 9 } 10 } 11 return false; 12 } 13 14 public boolean exist(char[][] board,int x,int y,String word,int index){ 15 if(index==word.length()) return true; 16 if(x<0 || y<0 || x>=board.length || y>=board[0].length || board[x][y]!=word.charAt(index)) 17 return false; 18 board[x][y]^=128; 19 boolean exist=exist(board,x-1,y,word,index+1)|| 20 exist(board,x+1,y,word,index+1)|| 21 exist(board,x,y-1,word,index+1)|| 22 exist(board,x,y+1,word,index+1); 23 board[x][y]^=128; 24 return exist; 25 } 26 }
原文:https://www.cnblogs.com/kexinxin/p/10163059.html