官方题解【动态规划】https://leetcode-cn.com/problems/word-break/solution/dan-ci-chai-fen-by-leetcode-solution/
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string> wordDictSet;
for(int i=0;i<wordDict.size();++i) wordDictSet.insert(wordDict[i]);
bool dp[s.size()+1];
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<=s.size();++i)
for(int j=0;j<i;++j){
if(dp[j] && wordDictSet.find(s.substr(j,i-j)) != wordDictSet.end()){
dp[i]=true; //前面有成型的句子,后面有单词
break;
}
}
return dp[s.size()];
}
};
优化https://leetcode-cn.com/problems/word-break/solution/dan-ci-chai-fen-by-leetcode-solution/459678
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string> wordDictSet;
int maxlen=0, len;
for(int i=0;i<wordDict.size();++i){
wordDictSet.insert(wordDict[i]);
len=wordDict[i].size();
maxlen=max(len, maxlen); //引入maxlen
}
bool dp[s.size()+1];
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<=s.size();++i)
for(int j=i;j>=0 && j>=i-maxlen;--j){ //使用maxlen,如果j~i的长度大于maxlen,直接跳过,看下一个i
if(dp[j] && wordDictSet.find(s.substr(j,i-j)) != wordDictSet.end()){
dp[i]=true; //前面有成型的句子,后面有单词
break;
}
}
return dp[s.size()];
}
};