1. 程式人生 > >Word Search -- LeetCode

Word Search -- LeetCode

com pop pre ans char dsm code con color

原題鏈接: http://oj.leetcode.com/problems/word-search/
這道題非常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