Leetcode 79 單詞搜尋(中等)

2021-10-09 10:19:39 字數 1694 閱讀 1488

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

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

示例: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

初步想法:

(1)構建無向圖,相鄰字母之間連通,用深度優先來求路徑

(2)記錄board的尺寸,直接通過下標進行訪問

(3)構建乙個visited陣列專門用來儲存是否訪問,或者直接修改訪問過的字母資訊為0,作為訪問標記

問題:(1)重複出現的字母如何確定最優 → 回溯法

(2)是否能遞迴實現 → 能

class solution }}

return false;

}private:

bool backtrack(vector>& board, string& word, int wordindex, int x, int y)

if(word.size() - 1 == wordindex)

char tmp = board[x][y]; //x為行,y為列

board[x][y] = 0; // 避免該位重複使用

wordindex++;

if((x > 0 && backtrack(board, word, wordindex, x - 1, y)) // 往上走

|| (y > 0 && backtrack(board, word, wordindex, x, y - 1)) // 往左走

|| (x < board.size() - 1 && backtrack(board, word, wordindex, x + 1, y)) // 往下走

|| (y < board[0].size() - 1 && backtrack(board, word, wordindex, x, y + 1)))

board[x][y] = tmp; // 如果都不通,則回溯上一狀態

return false;

}};

給出乙個遞迴演算法,其時間複雜度o(t) 通常是遞迴呼叫的數量(記作 r) 和計算的時間複雜度(表示為o(s))的乘積:o(t)=r∗o(s)

m,n 為矩陣的行數和列數。每個遞迴函式需要呼叫 word.size() 次。最壞情況下,word 為蛇形排列,長度為矩陣中的所有元素的數量,故每個遞迴函式呼叫次數為 o(m×n),且一次呼叫了四個遞迴函式,遞迴呼叫的總次數為o(4×m×n),在遞迴函式中我們只進行了 board[i][j] = tmp,複雜度為o(1),故遞迴的總時間複雜度為 o(t)=o(4×m×n)∗o(1)=o(m×n)

在主函式中的時間複雜度為o(m×n),故總的時間複雜度為 o((m×n) ^2)

leetcode 79 單詞搜尋

本題算是乙個組合類的題,也類似於深度優先搜尋演算法 設定乙個與字母構成的陣列大小相同的陣列,用來儲存某個位置的字母是否被訪問過,標註為1表示已被訪問過,避免重複 每次要看i,j位置上下左右的字母是否等於單詞第t個位置的字母 進行深度優先搜尋 bool find std vector board,st...

leetcode 79 單詞搜尋

給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。示例 board a b c e s f c s a d e e 給定 word abcced 返回t...

Leetcode 79 單詞搜尋

給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。示例 board a b c e s f c s a d e e 給定 word abcced 返回 ...