Leetcode 79.单词搜索

单词搜索

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

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 }

猜你喜欢

转载自www.cnblogs.com/kexinxin/p/10163059.html