每天一道LeetCode-----将字符串切分成若干单词,使得每个单词都在给定的字典中,求出所有的切分结果
生活随笔
收集整理的這篇文章主要介紹了
每天一道LeetCode-----将字符串切分成若干单词,使得每个单词都在给定的字典中,求出所有的切分结果
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Word Break
原題鏈接Word Break
給定一個字符串和單詞字典,將字符串切分成若干個單詞,使每個單詞都在字典中。判斷是否可以成功切分
假設字符串s[0 : n-1]可以成功切分成若干個單詞,那么一定存在一個i使得s[0 : i-1]可以成功切分成若干個單詞,同時s[i : n-1]在字典中存在,可以采用動態規劃的思想求解
令dp[i]表示s[0 : i-1]是否可以成功切分成若干單詞組合,最終要求解的是dp[n]。
那么每求一個dp[i]使,就在i前面尋找是否存在一個j使得dp[j]為真且s[j : i-1]在字典中
代碼如下
class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> hash;size_t maxLen = 0;for(auto& word : wordDict){hash.insert(word);maxLen = std::max(maxLen, word.size());}vector<int> dp(s.size() + 1, 0);dp[0] = 1;for(int i = 1; i <= s.size(); ++i){for(int j = i - 1; j >= 0 && (i - j) <= maxLen; --j){/* 尋找一個j使得s[0 : j-1]可以拆分 */if(dp[j]){/* 判斷s[j : i-1]是否在字典中 */string word = s.substr(j, i - j);if(hash.find(word) != hash.end()){/* 標記s[0 : i-1]可以成功拆分 */dp[i] = 1;break;}}}}return dp[s.size()];} };Word Break II
原題鏈接Word Break II
尋找所有的拆分結果
還是采用上述的思路,要將s[0 : n-1]拆分,那么就從后向前尋找i使得s[i : n-1]在字典中,然后拆分s[0 : i-1],將結果進行組合
代碼如下
class Solution { public:vector<string> wordBreak(string s, vector<string>& wordDict) {unordered_set<string> hash;for(auto& word : wordDict)hash.insert(word);return breakWord(s, hash);} private:vector<string> breakWord(string& s, unordered_set<string>& hash){/* 防止重復計算 */if(m.find(s) != m.end())return m[s];vector<string> res;for(int i = s.size() - 1; i >= 0; --i){string word = s.substr(i);if(hash.find(word) != hash.end()){string str = s.substr(0, i);vector<string> prevWords = breakWord(str, hash);for(auto& words : prevWords)res.emplace_back(words + " " + word);if(i == 0)res.emplace_back(word);}}m[s] = res;return res;} private:unordered_map<string, vector<string>> m; };總結
以上是生活随笔為你收集整理的每天一道LeetCode-----将字符串切分成若干单词,使得每个单词都在给定的字典中,求出所有的切分结果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一道LeetCode-----复制一
- 下一篇: 每天一道LeetCode-----重排链