代码随想录第四十六天
139.单词拆分
给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
将字符串s对应为背包容量,wordDict对应物品,dp[i][j]为s中前j个字符构成字符串是否能够由0-i的单词构成,
递推为dp[i][j]=dp[i][j-k]&&s(j-k,j)属于单词列表中的字符串
遍历为两者都可,但是目前笔者自己只能实现先遍历单词表,在遍历字符串,且运行效率较低,希望二刷的时候可以写出更加高效的代码
代码如下:
bool wordSplit(string& s, vector<string>&wordlist)
{
vector<unordered_set<string>>set(wordlist.size());
for (int i=0;i<wordlist.size();i++)
{
set[i] = unordered_set<string>(wordlist.begin(), wordlist.begin() + i + 1);
}
vector<bool>dp(s.size()+1,false);
dp[0] = true;
for (int i=0;i<wordlist.size();i++)
{
vector<int>k;
k.push_back(0);
for (int j=0;j<=s.size();j++)
{
for (int m=0;m<k.size();m++)
{
if (dp[k[m]] == true)
{
string str(s.begin() + k[m], s.begin() + j);
if (set[i].find(str) != set[i].end())
{
dp[j] = true;
k.push_back(j);
break;
}
}
}
}
}
return dp[s.size()];
}