1.状态表示
是什么?dp表中里的值所表示的含义就是状态表示
dp[i]表示:[0,i]区间内的字符串,能否被字典中的单词拼接而成(存ture或false)
2.状态转移方程
dp[i] 等于什么
根据最后一个位置,来划分问题(最后n个字符构成一个单词)
设j为最后一个单词起始位置的下标 0 <= j <= i
那么除去最后一个单词剩下的字符串区间就是[0,j-1]
同时满足dp[j-1] == ture 和 [ j , i ]区间在字典中,dp[i] 为ture
否则dp[i]为false
3.初始化
保证填表的时候不越界
当j=0时(把整个字符串当做一个单词)j-1会越界访问
所以dp表在前面加一个辅助节点(虚拟节点)
dp[0] = ture
因为dp表多了一个节点,为了让下标关系一一对应,对应的字符串前多一个空格
4.填表顺序
为了填写当前状态的时候,所需要的状态已经计算过了
5.返回值
题目要求+状态表示
6.代码
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
//优化
unordered_set<string> hash;
for(auto e: wordDict) hash.insert(e);
int n = s.size();
//1.创建dp表
vector<bool> dp (n+1);
//2.初始化
dp[0] = true;//保证后面填表是正确的
s = ' '+s;//原始字符串的下标+1
//3.填表
for(int i = 1; i < n+1;i++)
{
for(int j =i;j>=1;j--)//最后一个单词的起始位置
{
if(dp[j-1] && hash.count(s.substr(j,i-j+1)))
{
dp[i] = true;
break;
}
}
}
//4.返回值
return dp[n];
}
};