企业网站建设排名口碑,网络策划书一般包括哪些内容,如何建设类似大众点评网站,湖南网站建设企业1. 题目
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict#xff0c;在字符串中增加空格来构建一个句子#xff0c;使得句子中所有的单词都在词典中。返回所有这些可能的句子。
说明#xff1a; 分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的…1. 题目
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict在字符串中增加空格来构建一个句子使得句子中所有的单词都在词典中。返回所有这些可能的句子。
说明 分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。
示例 1
输入:
s catsanddog
wordDict [cat, cats, and, sand, dog]
输出:
[cats and dog,cat sand dog
]示例 2
输入:
s pineapplepenapple
wordDict [apple, pen, applepen, pine, pineapple]
输出:
[pine apple pen apple,pineapple pen apple,pine applepen apple
]
解释: 注意你可以重复使用字典中的单词。示例 3
输入:
s catsandog
wordDict [cats, dog, sand, and, cat]
输出:
[]来源力扣LeetCode 链接https://leetcode-cn.com/problems/word-break-ii 著作权归领扣网络所有。商业转载请联系官方授权非商业转载请注明出处。
2. DP回溯
相关题目LeetCode 139. 单词拆分DP
先在139题的基础上判断单词是否可以拆分如果可以的话进行回溯暴力查找所有可能
class Solution {
public:vectorstring wordBreak(string s, vectorstring wordDict) {int i, j, n s.size();unordered_setstring set(wordDict.begin(), wordDict.end());bool dp[n1] {false};//dp[j]包含第j个字符为结尾的字符能否拆分dp[0] true;//空字符能拆分for(i 0; i n; i){if(dp[i] true)//左半边存在for(j i1; j n; j){if(set.count(s.substr(i,j-i)))dp[j] true;}}if(dp[n] true)//整个字符串可以拆{vectorstring ans;string str;int end 1;while(end n dp[end] ! 1)end;//找到下一个可拆点bt(s,set,dp,ans,str,0,end);return ans;}elsereturn {};//不能拆返回空}void bt(string s, unordered_setstring set, bool *dp, vectorstring ans,string str, int start, int end){if(start end)return;string temp s.substr(start,end-start);//[s,e]的字符bool inSet set.count(temp);//该字符在set集合中if(end s.size())//取到最后字符了{if(inSet)ans.push_back(strtemp);//将前缀和当前组合加入答案return;}int next end1;while(next s.size() dp[next] ! 1)next;//找下一个分割点bt(s,set,dp,ans,str,start,next);//不插入空格start不变end变下一个if(inSet)//字符在集合中才能加空格bt(s,set,dp,ans,strtemp ,end,next);//start变endend变next}
};