转化很难:
将字符串当作是背包,字符串数组里面的元素当作物品,本题求的是,物品能否将背包装满
1. dp 数组的含义
下标:字符串的长度
值:表示是否能装下
2. 递推公式
3.初始化
为了后面递推公式的计算这里初始化 dp [ 0 ] = true
4. 遍历顺序
先 背包 后 物品 ,求的是排列数
因为这里不同的顺序意味着不同的字符串,所以对顺序是由要求的
{ap} {pa} 不能看作是同一个字符串
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
// 使查找的速度更快,常数时间
unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
vector<bool> dp(s.size() + 1, false);
dp[0] = true;
for(int j = 1; j <= s.size(); j++) // 背包
{
for(int i = 0; i < j; i++) // 物品
{
string str = s.substr(i , j - i);
if(wordSet.find(str) != wordSet.end() && dp[i])
dp[j] = true;
}
}
return dp[s.size()];
}
};