LeetCode 139.单词拆分
ways:
dp[n]的定义:
从s[0]到s[n]是否可以利用字典中出现的单词拼接出来
dp初始化:
dp要比s多一个,并且dp[0] = true
步骤:
遍历s:
if(s[i] == wordDict[j] [0]) :
i和j[0]向下遍历,if(s的一部分和wordDict[j]都相等并且dp[s之前之前结束的位置]==true) , 则dp[s现在结束的位置] = true;
else
继续遍历
return dp[s.size()];
自己的完整代码:
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
vector<bool> dp(s.size()+1,false);
dp[0] = true;
for(int i=0 ; i<s.size() ; i++)
{
for(int j=0 ; j<wordDict.size() ; j++)
{
if(s[i] == wordDict[j][0])
{
int k=0,n=i;
while(k<wordDict[j].size() && n<s.size() && wordDict[j][k] == s[n])
{
k++;
n++;
}
if(k==wordDict[j].size() && dp[n-k])
{
dp[n] = true;
}
}
}
}
return dp[s.size()];
}
};
他人代码:
// 利用s.substr(起始位置,截取长度)节省代码量,阅读方便
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
int n = s.length();
vector<bool> res(n+1,0);
res[0] = 1;
for(int i=1;i<=n;i++) // i从1开始,到n截止
{
for(const string &str : wordDict)
{
int len = str.length();
if(i>=len && s.substr(i-len,len)==str)
res[i] = res[i] || res[i-len]; // 既判断此方案行不行,也能判断之前有没有方案可以; 真的牛!
}
}
return res[n];
}
};