單詞拆分
給定乙個非空字串 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 ...