1. 程式人生 > 實用技巧 >Leetcode 79 單詞搜尋

Leetcode 79 單詞搜尋

Leetcode 79 單詞搜尋

1. 題目

79. 單詞搜尋

給定一個二維網格和一個單詞,找出該單詞是否存在於網格中。

單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重複使用。

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

給定 word = "ABCCED", 返回 true
給定 word = "SEE", 返回 true
給定 word = "ABCB", 返回 false

提示:

board 和 word 中只包含大寫和小寫英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3

2. 程式碼

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        int n = board.size();
        int m = board[0].size();
        for(int i = 0; i<n; ++i){
            for(int j = 0; j<m; ++j){
                if(board[i][j] == word[0] && dfs(i, j, board, word, 0)){
                    return true;
                }
            }
        }
        return false;
    }
private:
    bool dfs(int x, int y, vector<vector<char>>& board, string& word, int index){
        int n = board.size();
        int m = board[0].size();
 
        if(x<0 || x>=n || y<0 || y>=m || board[x][y] != word[index]){
            return false;
        }
        if(index == word.size() - 1){
            return true;
        }
        char c = board[x][y];
        board[x][y] = '\0';
        if(dfs(x + 1, y, board, word, index + 1) 
                || dfs(x - 1, y, board, word, index + 1)
                || dfs(x, y + 1, board, word, index + 1)
                || dfs(x, y - 1, board, word, index + 1)){
            return true;
        }
        board[x][y] = c;
        return false;   
    }
};


3. 思路

感覺思路很簡單,這裡貼一下修改過程。本來交上是60ms 很慢,後面改成了24ms。

60ms優化到24ms的心得:

  1. 去掉迴圈,直接四個方向用||連線判斷
  2. 不用used,在原board上修改(當然這樣不一定規範
  3. 結束條件放到檢查邊界後面,因為結束條件true的次數很少,放前面開銷大
  4. 使用if(dfs()) return true;這種模式,可以節約flag變數

不過我還是覺得,程式碼過於簡潔並不是好事,可能刷題顯得很酷,但是沒用。需要在過度冗餘和過度簡潔中間找一個平衡點,兼具效能、可讀性、可維護性的程式碼才是好程式碼。