首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode 140. 单词拆分 II(DP+回溯)

LeetCode 140. 单词拆分 II(DP+回溯)

作者头像
Michael阿明
发布于 2020-07-13 07:55:41
发布于 2020-07-13 07:55:41
81100
代码可运行
举报
运行总次数:0
代码可运行

1. 题目

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。

说明:

分隔时可以重复使用字典中的单词。

你可以假设字典中没有重复的单词。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
示例 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题的基础上,判断单词是否可以拆分
  • 如果可以的话,进行回溯,暴力查找所有可能
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    vector<string> wordBreak(string s, vector<string>& wordDict) {
        int i, j, n = s.size();
        unordered_set<string> set(wordDict.begin(), wordDict.end());
        bool dp[n+1] = {false};//dp[j]包含第j个字符为结尾的字符能否拆分
        dp[0] = true;//空字符能拆分
        for(i = 0; i <= n; ++i)
        {
            if(dp[i] == true)//左半边存在
                for(j = i+1; j <= n; ++j)
                {
                    if(set.count(s.substr(i,j-i)))
                        dp[j] = true;
                }
        }
        if(dp[n] == true)//整个字符串可以拆
        {
            vector<string> ans;
            string str;
            int end = 1;
            while(end <= n && dp[end] != 1)
                end++;//找到下一个可拆点
            bt(s,set,dp,ans,str,0,end);
            return ans;
        }
        else
            return {};//不能拆,返回空
    }

    void bt(string &s, unordered_set<string> &set, bool *dp, vector<string> &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(str+temp);//将前缀和当前组合,加入答案
            return;
        }
        int next = end+1;
        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,str+temp+" ",end,next);//start变end,end变next
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验