79. 單詞搜尋

ouyangxx發表於2024-11-15
  1. 題目連結

  2. 解題思路

    • 一道回溯的題目。
    • 我現在在[i, j],然後處理到單詞的index位置,index之前的都已經解決了,現在要往哪走?很明顯如果[i + 1, j]的位置等於index的單詞,我可以去「試試」能不能走通。所以其實很簡單,每當來到[i, j],單詞index,我就看上下左右四個位置,如果和index的位置相等,就可以去試試。如果上下左右都不行,那就說明「此路不通」,這一次的嘗試失敗了。
    • 有一個細節,我怎麼能夠「不走回頭路」?很簡單,我走過的位置,就把其變成一個不可能的字母,比如255。
  3. 程式碼

    class Solution {
    public:
    
        vector<vector<int>> dir{{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
    
        // 當前在[i, j]   來到了單詞的index位置
        bool process(vector<vector<char>>& board, string &word, int index, int i, int j, const int n, const int m) {
            if (index == word.size()) {
                return true;
            }
            // 這個for迴圈其實就是上下左右四個方向嘗試
            for (int k = 0; k < 4; ++k) {
                int next_i = i + dir[k][0];
                int next_j = j + dir[k][1];
                bool ans = false;
                if (next_i >= 0 && next_i < n && next_j >= 0 && next_j < m && board[next_i][next_j] == word[index]) {
                    board[next_i][next_j] = 250;    // 標記我已經走過了
                    ans = process(board, word, index + 1, next_i, next_j, n, m);
                    board[next_i][next_j] = word[index];   // 不要忘記恢復回來
                }
                if (ans) {
                    return true;
                }
            }
            return false;
    
        }
    
        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) {
                    bool ans = false;
                    if (board[i][j] == word[0]) {
                        board[i][j] = 250;
                        ans = process(board, word, 1, i, j, n, m);
                        board[i][j] = word[0];
                    }
                    if (ans) {
                        return true;
                    }
                }
            }
            return false;
        }
    };
    

相關文章