【演算法分析與設計】【第十五週】139. Word Break
阿新 • • 發佈:2019-01-25
動態規劃基礎訓練。
139. Word Break
題目大意
給定一個字串和一個合法詞的集和(詞典),判斷該字串能否由詞典中的片語成。
例
s= “leetcode”
wordDict = [“leet”,”code”]
return true
思路
《演算法概論》P178Ex6.4
狀態轉移式:
// bool f[i]代表substr[0, i]能否由詞典中的片語成
init:
f[0] = false (if s[0] !∈ wordDict)
f[0] = true (if s[0] ∈ wordDict)
f[i] = ∪ {f[k] && substr[k+1, i] ∈ wordDict},k = 0, 1, ..., i-1
解題程式碼
坑主要在劃分子串的時候,下標和迭代器的邊界。
class Solution {
public:
bool isWord(vector<string>& wordDict, string substr) {
int dictSize = wordDict.size();
for (int i = 0; i < dictSize; i++) {
if (wordDict[i] == substr) return true;
}
return false;
}
bool wordBreak(string s, vector<string>& wordDict) {
int len = s.length();
string substr;
if (len == 0) {
if (isWord(wordDict, "")) return true;
else return false;
}
if (len == 1) {
if (isWord(wordDict, substr.assign(s.begin(), s.begin()+1 ))) return true;
else return false;
}
bool f[len];
if (isWord(wordDict, substr.assign(s.begin(), s.begin()+1))) f[0] = true;
else f[0] = false;
bool flag = false;
for (int i = 1; i < len; i++) {
for (int k = 0; k < i; k++) {
substr.assign(s.begin()+k+1, s.begin()+i+1);
if ((f[k] == true && (isWord(wordDict, substr)) == true)
|| isWord(wordDict, substr.assign(s.begin(), s.begin()+i+1)) == true) {
f[i] = true;
flag = true;
break;
}
}
if (flag == false) f[i] = false;
flag = false;
}
//for (int i = 0; i < len; i++) cout << f[i] << " ";
if (f[len-1] == true) return true;
else return false;
}
}; // Runtime: 16 ms
時間複雜度
O(n^3)
可以說是直接把狀態轉移式照搬了,還需要優化