问题描述与解题思路
确定本题的状态表示
f[i+1]表示s[0]~s[i]这个子串能否被字典中的单词拼出
确定本题的状态转移方程
对于每个位置 i,从 0 到 i - 1 遍历,如果 dp[j] 为 true 且子字符串 s.substr(j, i - j) 存在于字典中,那么 dp[i] = true。
填表求值
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果
代码实现
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
// f[i+1]表示s[0]~s[i]这个子串能否被字典中的单词拼出
int n=s.size();
vector<bool> f(n+1);
f[0]=true;
set<string> myset;
for(int i=0;i<wordDict.size();i++){
myset.insert(wordDict[i]);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
// cout << "i="<< i<<" j="<< j<< " "<<s.substr(j-1,i-j+1) << endl;
if(f[j-1]==true&&myset.find(s.substr(j-1,i-j+1))!=myset.end()){
f[i]=true;
// cout << "f["<<i<<"]=true"<< endl;
break;
}
}
}
return f[n];
}
};

1560

被折叠的 条评论
为什么被折叠?



