1. 程式人生 > >Leetcode 79.單詞搜尋

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 }