Leetcode140单词拆分 II

给定一个非空字符串 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"] 输出: []

 

 

结合单词拆分1,在dp过程将句子存下来。结果超出内存限制

class Solution
{
  public:
    vector<string> wordBreak(string s, vector<string> &wordDict)
    {
        vector<string> ans;
        if (wordDict.size() <= 0)
        {
            return ans;
        }
        if (s.size() <= 0)
        {
            return ans;
        }
        map<string, bool> Check;
        map<int, vector<string>> save;
        for (int i = 0; i < wordDict.size(); i++)
        {
            Check[wordDict[i]] = true;
        }
        vector<bool> dp(s.size(), false);
        for (int i = 0; i < s.size(); i++)
        {
            string temp(s.begin(), s.begin() + i + 1);
            if (Check[temp])
            {
                dp[i] = true;
                save[i].push_back(temp);
            }
            for (int j = 0; j < i; j++)
            {
                if (dp[j] == true)
                {
                    string temp2(s.begin() + j + 1, s.begin() + i + 1);
                    if (Check[temp2])
                    {
                        dp[i] = true;
                        for (int k = 0; k < save[j].size(); k++)
                        {
                            save[i].push_back(save[j][k] + ' ' + temp2);
                        }
                    }
                }
            }
        }
        return save[s.size() - 1];
    }
};

原因是存储了整个字符串句子,使map需要存储的数据过大。

我们只存储当时匹配到的一段字符串。

最后再用DFS去搜索答案。

 

DP加DFS

class Solution
{
    map<int, vector<string>> save;
    vector<string> ans;

  public:
    vector<string> wordBreak(string s, vector<string> &wordDict)
    {
        if (wordDict.size() <= 0)
        {
            return ans;
        }
        if (s.size() <= 0)
        {
            return ans;
        }
        map<string, bool> Check;
        for (int i = 0; i < wordDict.size(); i++)
        {
            Check[wordDict[i]] = true;
        }
        vector<bool> dp(s.size(), false);
        for (int i = 0; i < s.size(); i++)
        {
            string temp(s.begin(), s.begin() + i + 1);
            if (Check[temp])
            {
                dp[i] = true;
                save[i].push_back(temp);
            }
            for (int j = 0; j < i; j++)
            {
                if (dp[j] == true)
                {
                    string temp2(s.begin() + j + 1, s.begin() + i + 1);
                    if (Check[temp2])
                    {
                        dp[i] = true;
                        save[i].push_back(temp2);
                    }
                }
            }
        }
        if(!dp[s.size() - 1])
            return ans;
        DFS(s.size(), "");
        return ans;
    }

    void DFS(int len, string s)
    {
        if(len == 0)
        {
            ans.push_back(s);
            return;
        }
        for (int i = 0; i < save[len - 1].size(); i++)
        {
            DFS(len - save[len - 1][i].size(), save[len - 1][i]+ (s == ""? "" : " ") + s);
        }
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值