leetcode 139單詞拆分

2021-09-14 07:17:09 字數 1498 閱讀 7269

單詞拆分

給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典**現的單詞。

說明:

示例 1:

輸入:s = "leetcode", worddict = ["leet", "code"]輸出:true解釋:返回 true 因為 "leetcode" 可以被拆分成 "leet code"。
示例 2:輸出:true

注意可以重複使用字典中的單詞

示例 3:

輸入:s = "catsandog", worddict = ["cats", "dog", "sand", "and", "cat"]輸出:false
解題思路:首先想到利用dfs去做,具體的:從0開始遍歷字串s,找到第乙個出現在給定字典中的字串,然後進入遞迴過程,

將s中剩下的字串作為遞迴的輸入,遞迴停止的條件為:遍歷完s中最後乙個字元時恰好擷取的子串是給定字典中的單詞。

結果:29/36個測試用例時出現超時的錯誤提示

原因分析:當輸入字串中存在大量的重複字元時,如下圖中的'a',演算法每遍歷乙個字元就進入遞迴過程,多次呼叫堆疊,造

成大量的空間和時間的開銷,同時容易造成棧溢位。

解決方法:應該注意到字典中存在'a', 'aa', 'aaa',但s中存在大量重複字元時dfs卻乙個乙個字元處理,實際可以從0開始將

s的所有子串作為處理物件,這就用到了動態規劃的思想,即建立乙個bool陣列dp,初始化為false, 儲存每個子串是否是給定

字典中的單詞,dp[i]即儲存前i個節點所組成字串是否為給定字典中的單詞,後面對每個節點的判斷都要利用前面dp[i]的資訊。

具體**:

class solution

for (int i = start; i < s.size(); i++)

else}}

return false;

}bool wordbreak(string s, vector& worddict)

return(wordbreakrecursion(s, 0, wordmap));}};

dp演算法:

class solution }}

return flag[n];}};

下面給出測試結果:

leetcode 139 單詞拆分

題目 給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,確定 s 是否可以被空格分割為乙個或多個在字典裡出現的單詞。你可以假設字典中無重複的單詞。例如,給出 s leetcode dict leet code 返回 true 因為 leetcode 可以被切分成 leet cod...

leetcode139 單詞拆分

給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典中出現的單詞。說明 拆分時可以重複使用字典中的單詞。你可以假設字典中沒有重複的單詞。示例 1 輸入 s leetcode worddict leet code 輸出 true 解釋 返...

leetcode139 單詞拆分

給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典 現的單詞。動態規劃,dp i 表示前i個字元能否被拆分 class solution def wordbreak self,s str,worddict list str bool ...