题意
题解
d p [ i ] dp[i] dp[i] 代表字符串 s s s 在索引 i − 1 i-1 i−1 是否能被拆分。若单词 j j j 与以索引 i − 1 i-1 i−1 结尾的子串末尾匹配,则有
d p [ i ] = d p [ i ] ∣ ∣ d p [ i − w o r d D i c t [ j ] . l e n g t h ( ) ] dp[i]=dp[i]\ ||\ dp[i-wordDict[j].length()] dp[i]=dp[i] ∣∣ dp[i−wordDict[j].length()]
初始化时,空串必然可以被拆分,需注意字符串与 d p dp dp 数组索引的不同。
class Solution
{
public:
bool wordBreak(string s, vector<string> &wordDict)
{
int n = s.length();
vector<bool> dp(n + 1);
dp[0] = true;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < wordDict.size(); j++)
{
int n2 = wordDict[j].length();
if (i + 1 < n2) continue;
int k = 0, d = i - n2 + 1;
while (k < n2 && s[d + k] == wordDict[j][k]) ++k;
dp[i + 1] = dp[i + 1] || (k == n2 ? dp[i + 1 - n2] : 0);
}
}
return dp[n];
}
};