两种方法:
1.深搜+记忆
class Solution {
private:
bool ans = false;
map<string,bool>mp;
public:
bool wordBreak(string s, vector<string>& wordDict) {
if(s == "")
{
ans = true;
cout<<"s"<<endl;
return ans;
}
for(int i = 0;i<s.size() && !ans;i++)
{
for(int j = 0;j<wordDict.size() && !ans;j++)
{
if(ans) return ans;
if(!ans && !mp.count(s.substr(i+1,s.size()-i-1)) && s.substr(0,i+1) == wordDict[j])
{
mp[s.substr(i+1,s.size()-i-1)] = true;
wordBreak(s.substr(i+1,s.size()-i-1),wordDict);
}
}
}
return ans;
}
};
2.dp
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
int dp[s.size()] = {0};
for(int i = 0;i<s.size();i++)
{
for(int j = 0;j<wordDict.size();j++)
{
if(s.substr(0,i+1) == wordDict[j])
{
dp[i] = 1;
}
}
}
for(int i = 0;i<s.size();i++)
{
if(dp[i])
{
for(int j = i+1;j<s.size();j++)
{
for(int k = 0;k<wordDict.size();k++)
{
if(s.substr(i+1,j-i) == wordDict[k])
{
dp[j] = 1;
if(j == s.size()-1) return true;
break;
}
}
}
}
}
return dp[s.size()-1];
}
};