[LeetCode][C++]单词拆分II

单词拆分II

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

说明:
分隔时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。

示例 1:
输入:
s = “catsanddog”
wordDict = [“cat”, “cats”, “and”, “sand”, “dog”]
输出:
[
\quad “cats and dog”,
\quad “cat sand dog”
]

示例 2:
输入:
s = “pineapplepenapple”
wordDict = [“apple”, “pen”, “applepen”, “pine”, “pineapple”]
输出:
[
\quad “pine apple pen apple”,
\quad “pineapple pen apple”,
\quad “pine applepen apple”
]
解释: 注意你可以重复使用字典中的单词。

示例 3:
输入:
s = “catsandog”
wordDict = [“cats”, “dog”, “sand”, “and”, “cat”]
输出:
[]


思路:
我也没有很好的,于是看了别人的博客(链接1),方法3,但是细节也没看懂,有点晕。

  1. 为什么“当s的长度是0时,我们需要往list中添加空字符串元素。”
  2. 他的源程序我也没看懂,是java写的。

链接1

记忆化搜索:
利用一个hashMap记录某个字符串所能产生的句子的列表。
如果所要寻找的s已经存在在hashMap中,我们直接从hashMap中取得其值即可。否则,我们就需要进入我们的递归函数计算该字符串s所能产生的句子列表。
注意:当s的长度是0时,我们需要往list中添加空字符串元素。同时,在递归调用得到subList列表后,拼接字符串时需要判断所拼接的字符串sub是否为空字符串,如果是空字符串,我们不需要拼接空格字符。
时间复杂度和时间复杂度均与字符串以及字典的情况相关。

代码:
将链接1的java代码改成C++的,因为我是写C++的。

class Solution {
public:
    
    unordered_map<string, vector<string>> hash_map;
    
    vector<string> wordBreak(string s, vector<string>& wordDict) {
        //所寻找的字符串已经在HashMap中,则返回其对应的句子列表
        if( hash_map.find(s) !=hash_map.end())
        {
            return hash_map.find(s)->second;  
        }
        //否则,使用递归函数计算该字符串所能产生的句子列表
        vector<string> res;
        if(s.length()==0){        
            res.push_back(""); //当s的长度是0时,我们需要往结果中添加空字符串元素,没有这步会出问题
            return res;
        }
        for(auto str:wordDict)
        {
            if(s.compare(0,str.length(),str)==0)
            {
                vector<string> sub_vec=wordBreak(s.substr(str.length()),wordDict); //substr只有一个参数,则返回对应下标至末尾的子串
                for(auto sub:sub_vec){
                    res.push_back(str+(""==sub?"":" ")+sub);  //子字符串为空,则为最后一个字符串,不需要接空格
                }
            }
        }
        hash_map.insert(make_pair(s,res));
        return res;
    }
};

结果:
单词拆分II

参考链接:
[1] LeetCode140——单词拆分II

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值