Word Search -- LeetCode
阿新 • • 發佈:2017-08-20
com pop pre ans char dsm code con color
原題鏈接: http://oj.leetcode.com/problems/word-search/
這道題非常easy感覺出來是圖的題目,事實上本質上還是做深度優先搜索。 這道題事實上還能夠變一變,比方字符能夠反復使用。
這道題非常easy感覺出來是圖的題目,事實上本質上還是做深度優先搜索。
基本思路就是從某一個元素出發。往上下左右深度搜索是否有相等於word的字符串。這裏註意每次從一個元素出發時要重置訪問標記(也就是說盡管單次搜索字符不能反復使用。可是每次從一個新的元素出發,字符還是又一次能夠用的)。深度優先搜索的算法就不再反復解釋了。不了解的朋友能夠看看
wiki - 深度優先搜索。我們知道一次搜索的復雜度是O(E+V),E是邊的數量,V是頂點數量,在這個問題中他們都是O(m*n)量級的(由於一個頂點有固定上下左右四條邊)。加上我們對每一個頂點都要做一次搜索。所以總的時間復雜度最壞是O(m^2*n^2),空間上就是要用一個數組來記錄訪問情況。所以是O(m*n)。代碼例如以下:
public boolean exist(char[][] board, String word) { if(word==null || word.length()==0) return true; if(board==null || board.length==0 || board[0].length==0) return false; boolean[][] used = new boolean[board.length][board[0].length]; for(int i=0;i<board.length;i++) { for(int j=0;j<board[0].length;j++) { if(search(board,word,0,i,j,used)) return true; } } return false; } private boolean search(char[][] board, String word, int index, int i, int j, boolean[][] used) { if(index == word.length()) return true; if(i<0 || j<0 || i>=board.length || j>=board[0].length || used[i][j] || board[i][j]!=word.charAt(index)) return false; used[i][j] = true; boolean res = search(board,word,index+1,i-1,j,used) || search(board,word,index+1,i+1,j,used) || search(board,word,index+1,i,j-1,used) || search(board,word,index+1,i,j+1,used); used[i][j] = false; return res; }
準備的時候多聯想還是比較好的,由於面試中經常會做完一道題會變一下問問,盡管經常不用又一次寫代碼。可是想了解一下思路,有興趣的朋友能夠想想哈。
Word Search -- LeetCode