139.单词拆分
题目链接:139.单词拆分
给你一个字符串 s
和一个字符串列表 wordDict
作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s
则返回 true
。
文章讲解/视频讲解:https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html
思路
这是一个完全背包问题,其中wordDict中的每个字符串为物品,字符串s为背包。dp[j]
代表了在当前遍历下,由s的下标范围[0, j - 1]
构成的子字符串能不能被拼接出来。由于这里需要考虑到每个字符串的拼接先后顺序,因此需要采用先遍历背包容量,再遍历物品的方法。初始赋值时,令dp[0] = true
,其余初值均赋予false。
dp数组的递推式为:
dp[j] = dp[j] || (dp[j - wordDict[i].size()] && s.substr(j - wordDict[i].size(), wordDict[i].size()) == wordDict[i]);
C++实现
class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {vector<bool> dp(s.size() + 1, false);dp[0] = true;for(int j = 0;j<=s.size();j++){for(int i = 0;i<wordDict.size();i++){if(j >= wordDict[i].size()){dp[j] = dp[j] || (dp[j - wordDict[i].size()] && s.substr(j - wordDict[i].size(), wordDict[i].size()) == wordDict[i]);}}}return dp[s.size()];}
};
多重背包
文章讲解:https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%E5%A4%9A%E9%87%8D%E8%83%8C%E5%8C%85.html