[LeetCode] - Word Break II

11 篇文章 0 订阅

Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.

Return all such possible sentences.

For example, given
s = "catsanddog",
dict = ["cat", "cats", "and", "sand", "dog"].

A solution is ["cats and dog", "cat sand dog"].

这道题是word break1的升级版,要求生成所有可能的结果。

一般而言,碰到这种要求生成所有结果的题目,最直接的想法就是DFS。这道题当然也可以直接用DFS做了。我们可以依次遍历每个prefix,如果当前的prefix在dict中,那么就递归往下遍历,用temp保存当前能够被break的部分,一切结束之后在backtrack。这个思路已经很熟悉了,就不多写了。

但是,这样直接的DFS是很慢很慢的,因为会有大量的东西被重复计算了。所有,很自然的想到要用DP。前面word break I中,DP中的table或者cache用来记录当前位置的substring可不可以被break。在这道题中,DP应该用来记录当前位置被break之后的结果,也就是一个ArrayList。

下面的程序是用cache+recursive的方式写的,除了cache保存的东西由boolean值换成了ArrayList,其它的几乎和word break I中完全一样。另外还有一点值得注意,就是在cache中要加入空字符串的base case,因为在递归中,我用ArrayList的大小作为了给定位置的substring是否能被break的判断标准。

这周末写出table+iterative的版本来。

public class Solution {
    public void wordBreakHelper(String s, Set<String> dict, HashMap<String, List<String>> cache) {
        if(s.length()==0) return;
        cache.put(s, new ArrayList<String>());
        for(int i=1; i<=s.length(); i++) {
            String firstHalf=s.substring(0, i), secondHalf=s.substring(i, s.length());
            if(dict.contains(firstHalf)) {
                if(!cache.containsKey(secondHalf)) {
                    wordBreakHelper(secondHalf, dict, cache);
                }
                if(cache.get(secondHalf).size() > 0) {
                    for(String ss : cache.get(secondHalf)) {
                        StringBuilder builder = new StringBuilder(firstHalf).append(" ").append(ss);
                        if(ss.length()==0) builder.deleteCharAt(builder.length()-1);
                        cache.get(s).add(builder.toString());
                    }
                }
            }
        }
        return;
    }
    
    public List<String> wordBreak(String s, Set<String> dict) {
        if(s==null) return new ArrayList<String>();
        HashMap<String, List<String>> cache = new HashMap<String, List<String>>();
        ArrayList<String> baseCase = new ArrayList<String>();
        baseCase.add("");
        cache.put("", baseCase);
        wordBreakHelper(s, dict, cache);
        return cache.get(s);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值