Leetcode 79 單詞搜尋
阿新 • • 發佈:2020-09-13
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的心得:
- 去掉迴圈,直接四個方向用||連線判斷
- 不用used,在原board上修改(當然這樣不一定規範
- 結束條件放到檢查邊界後面,因為結束條件true的次數很少,放前面開銷大
- 使用if(dfs()) return true;這種模式,可以節約flag變數
不過我還是覺得,程式碼過於簡潔並不是好事,可能刷題顯得很酷,但是沒用。需要在過度冗餘和過度簡潔中間找一個平衡點,兼具效能、可讀性、可維護性的程式碼才是好程式碼。