1.题目解析
题目来源:139.单词拆分------力扣
测试用例
2.算法原理
1.状态表示
创建dp表,dp[i]表示:以第i个位置为结尾前面的字符串是否可以使用字典中的单词拼凑而成
所以dp表存储的是bool类型的数据
2.状态转移方程
这里的状态转移方程不是很重要,重要的是如何判断一个字符串是否可以使用字典中的单词拼凑而成,这里的思路就是首先使用i向后移动遍历字符串每个长度的子数组,使用j指针从i位置向前移动,判断区间[1,j-1]以及[j,i]这两个区间是否都可以被字典中的单词拼凑出来,是则将dp[i]置为true
3.初始化
开辟一个虚拟节点置为true,不会影响填表顺序也可以直接在循环内初始化
4.填表顺序
从左到右
5.返回值
返回最后一个位置的dp表的值
3.实战代码
cpp
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict)
{
int n = s.size();
unordered_set<string> hash;
for(auto& e : wordDict)
{
hash.insert(e);
}
s = ' ' + s;
vector<bool> dp(n+1);
dp[0] = true;
for(int i = 1;i <= n;i++)
{
for(int j = i;j >= 1;j--)
{
if(dp[j-1] && hash.count(s.substr(j,i-j+1)))
{
dp[i] = true;
}
}
}
return dp[n];
}
};