標籤:
Question:
Given a 2D board and a word, find if the word exists in the grid.
The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.
For example,
Given board =
[ ["ABCE"], ["SFCS"], ["ADEE"]]
word = "ABCCED", -> returns true,
word = "SEE", -> returns true,
word = "ABCB", -> returns false.
1、題型分類:
2、思路:
該題類似於迷宮,遞迴回溯。要實現從某一步開始往下找,發現找不到了,能夠回到當初的那一步,那麼就要將遞迴的地方放在搜尋的過程中,要判斷能否搜尋到結果,就要將遞迴放在if語句中,搜尋失敗後能從這一步再次搜尋。要實現不搜尋找過的路,需要一個輔助數組。
3、時間複雜度:
4、代碼:
public boolean exist(char[][] board, String word) { //an array help to determine the path has searched if(board==null || word==null || word.length()==0) return false; //if(board.length==1) return new String(board[0]).indexOf(word)>=0; boolean [][] check=new boolean [board.length][board[0].length]; for(int i=0;i<board.length;i++) { for(int j=0;j<board[0].length;j++) { check[i][j]=false; } } for(int i=0;i<board.length;i++) { for(int j=0;j<board[0].length;j++) { if(board[i][j]==word.charAt(0) && check[i][j]==false) { check[i][j]=true; if(word.length()==1 || search(board, word.substring(1), i, j, check)) return true; check[i][j]=false; } } } return false; } public boolean search(char[][] board, String word,int y,int x,boolean[][] check) { int[][] direction={{1,0},{-1,0},{0,1},{0,-1}}; for(int k=0;k<direction.length;k++) { int xx=x+direction[k][0]; int yy=y+direction[k][1]; if(xx>=0 && xx<board[0].length && yy>=0 && yy<board.length && board[yy][xx]==word.charAt(0) && check[yy][xx]==false) { check[yy][xx]=true; if(word.length()==1 || search(board, word.substring(1), yy, xx, check)) return true; check[yy][xx]=false; } } return false; }
5、最佳化:
6、擴充:
[LeetCode] Word Search