题目来源: 139. https://leetcode.com/problems/word-break/description/
动态规划基础训练。
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)
可以说是直接把状态转移式照搬了,还需要优化