动态规划
dp[i]=true为i之前的子串能被分割为字典当中的词
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {//dynamic programming
unordered_map<string,int> dict;
if (wordDict.size()==0) return false;
vector<bool> dp(s.size()+1,false);//i-1元素是否为i前的最近词末尾
dp[0]=true;
for (int i=0;i<wordDict.size();i++){
dict[wordDict[i]]=i;
}
for (int i=1;i<=s.size();i++){
for (int j=i-1;j>=0;j--){
if (dp[j]){
string temp=s.substr(j,i-j);
if (dict.find(temp)!=dict.end()){
dp[i]=true;
break;
}
}
}
}
return dp[s.size()];
}
};
深搜( Time Limit Exceeded)有助与理解
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
//algorithm中的find函数
if (find(wordDict.begin(),wordDict.end(),s)!=wordDict.end()) return true;
int len=s.size();
for (int i=len-1;i>=0;i--){
string temp=s.substr(i,len-i);
//cout<<temp<<" ";
if (find(wordDict.begin(),wordDict.end(),temp)!=wordDict.end()){
string remain=s.substr(0,i);
//cout<<remain<<endl;
if (!wordBreak(remain,wordDict)){
continue;
}
return true;
}
}
return false;
}
};