给你一个字符串 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"] 输出: falses
//dp[j] 表示长度为j的字符串,有一个或多个wordDict里的字符串组成
//dp[j] = true;就是其递推公式
//初始化dp[0] = true; 其他为false
//遍历顺序 先遍历背包再遍历物品,求排列数
//打印dp数组
- class Solution {
- public:
- bool wordBreak(string s, vector
& wordDict) { - //dp[j] 表示长度为j的字符串,有一个或多个wordDict里的字符串组成
- //dp[j] = true;就是其递推公式
- //初始化dp[0] = true; 其他为false
- //遍历顺序 先遍历背包再遍历物品,求排列数
- //打印dp数组
- unordered_set
wordSet(wordDict.begin(), wordDict.end()) ; - vector<bool> 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()];
- }
- };
还有很多瑕疵,还需继续坚持!