dede医院网站模板,市政工程公司,凡科登录网,常州建设安全员报名网站leetcode 139.单词拆分 题目链接#xff1a;139. 单词拆分 - 力扣#xff08;LeetCode#xff09; 视频链接#xff1a;动态规划之完全背包#xff0c;你的背包如何装满#xff1f;| LeetCode#xff1a;139.单词拆分_哔哩哔哩_bilibili 题目概述
给你一个字符串 s 和一… leetcode 139.单词拆分 题目链接139. 单词拆分 - 力扣LeetCode 视频链接动态规划之完全背包你的背包如何装满| LeetCode139.单词拆分_哔哩哔哩_bilibili 题目概述
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。
注意不要求字典中出现的单词全部都使用并且字典中的单词可以重复使用。
示例 1
输入: s leetcode, wordDict [leet, code]
输出: true
解释: 返回 true 因为 leetcode 可以由 leet 和 code 拼接成。示例 2 输入: s applepenapple, wordDict [apple, pen] 输出: true 解释: 返回 true 因为 applepenapple 可以被拆分成 apple pen apple。 注意你可以重复使用字典中的单词。
示例 3 输入: s catsandog, wordDict [cats, dog, sand, and, cat] 输出: false 思路
本题可以把字符串当成背包把单词当成物品这里边单词可以重复利用就说明这是个完全背包依旧是动规五部曲
1.确定dp数组含义
dp[i] : 字符串长度为i的话dp[i]为true表示可以拆分为一个或多个在字典中出现的单词。
2.确定递推公式
递推公式 if([j, i] 这个区间的子串出现在字典里 dp[j]是true) 那么 dp[i] true。
3.数组初始化
dp[0]true,其余的都初始化成false。
4.确定遍历顺序
本题求的是排列数先遍历背包后遍历物品。
为什么是排列数呢例如smomwordDictm,o.把m编号为1把o编号为2那么mom就是由编号121组成而112和211都不行讲究顺序所以是排列数。
5.打印数组 代码实现
class Solution {
public:bool wordBreak(string s, vectorstring wordDict) {unordered_setstring wordSet(wordDict.begin(), wordDict.end());vectorbool dp(s.size() 1, false);dp[0] true;for (int i 1; i s.size(); i) { // 遍历背包for (int j 0; j i; j) { // 遍历物品string word s.substr(j, i - j); //substr(起始位置截取的个数)if (wordSet.find(word) ! wordSet.end() dp[j]) {dp[i] true;}}}return dp[s.size()];}
};