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.

思路

本題與 695. 島嶼的最大面積 一題類似,利用遞迴判斷是否存在符合要求的字串,需要注意的是不能加入 flag 陣列進行查重判斷,會出現如下情況:

程式碼

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        if(board.size()==0) return 0;
        if(board[0].size()==0) return 0;
        int m = board.size();
        int n = board[0].size();
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(dfs(board,i,j,word,0))
                    return true;
            }
        }
        return false;
    }
    bool dfs(vector<vector<char>>& board, int i, int j, string word, int k){
        if(k == word.size()){
            return true;
        }
        int m = board.size();
        int n = board[0].size();
        if(i<0 || j<0 || i>=m || j>=n){
            return false;
        }
        bool res = false;
        if(board[i][j]==word[k]){
            //利用temp避免重複查詢
            char temp = board[i][j];
            board[i][j] = '/';
            res = dfs(board,i-1,j,word,k+1) || 
                dfs(board,i+1,j,word,k+1) || 
                dfs(board,i,j-1,word,k+1) || 
                dfs(board,i,j+1,word,k+1);
            board[i][j] = temp;
        }
        return res;
    }
};