起初想到了使用回溯法,结果超时了
// 回溯法
class Solution {
public:
vector<string> cur;
bool flag = false;
bool wordBreak(string s, vector<string>& wordDict) {
dfs(s,0,wordDict);
return flag;
}
void dfs(string s,int start,vector<string>& wordDict)
{
if(start == s.size())
{
flag = true;
return;
}
for(int i = start ; i < s.size() ; i++)
{
if(find(wordDict.begin(),wordDict.end(),s.substr(start,i+1-start)) != wordDict.end())
{
cur.push_back(s.substr(start,i+1-start));
dfs(s,i+1,wordDict);
cur.pop_back();
}
}
}
};
实在没想通怎么用动态规划,看了下官方的题解然后自己又尝试写了一下,代码如下:
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
int n = s.size();
auto dp = vector<bool>(n + 1);
dp[0] = true;
for(int i = 1 ; i<=n ; i++)
{
for(int j = 0;j<=i-1 ; j++)
{
if(dp[j] == true && find(wordDict.begin(),wordDict.end(),s.substr(j,i-j)) != wordDict.end())
{
dp[i] = true;
break;
}
}
}
return dp[n];
}
};