给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
- 拆分时可以重复使用字典中的单词。
- 你可以假设字典中没有重复的单词。
思路:dp[i]表示s[0…i-1]是否可以被拆分为一个或多个在字典中出现的单词。双层for循环,对每一个字符i做查找,找到当前字符往前遇到的可以拆分的子串s[0…j-1],若子串s[j…i-j]可以在字典中找到,则s[0…i-1]可以被拆分,dp[i]=true;
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string>dict;
for(auto &it:wordDict){
dict.insert(it);
}
if(dict.size()==0) return false;
int n=s.size();
vector<bool> dp(n+1);
dp[0]=true;
for(int i=1;i<=n;i++)
{
for(int j=i-1;j>=0;j--)
{
if(dp[j])
{
string word = s.substr(j,i-j);
if(dict.find(word)!= dict.end())
{
dp[i]=true;
break; //next i
}
}
}
}
return dp[n];
}