• 140. Word Break II


    题目:

    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"].

    链接: http://leetcode.com/problems/word-break-ii/

    题解:

    又看到这种求所有解集的题目,自然就想到用DFS + Backtracking。在Word Ladder II里我们这样做,在这里我们依然这样做。感觉现在DFS往往伴随Backtracking,以后面试题估计这是一种常态。 这里需要注意的是对有个超长的case,我们要提前判断能否word break,所以还要用带一部分Word Break I里面的代码。  为图省事直接copy & paste了,其实应该还能重构一下,让代码不那么sloppy。回溯的部分依然是Word Break I的结构,使用了一个StringBuilder来回溯加入的单词以及空格。这回时间复杂度是真的O(2n)了。

    Time Complexity - O(2n), Space Complexity - O(2n)

    public class Solution {
        public List<String> wordBreak(String s, Set<String> wordDict) {
            List<String> res = new ArrayList<>();
            if(s == null || wordDict == null)
                return res;
            StringBuilder sb = new StringBuilder();
            if(canWordBreak(s, new HashSet<String>(wordDict)))      //find out if we can word break
                findAllWordBreak(res, sb, s, wordDict);
            return res;
        }
        
        private void findAllWordBreak(List<String> res, StringBuilder sb, String s, Set<String> wordDict) {
            if(s.length() == 0) {
                res.add(sb.toString().trim());
                return;
            }
            
            for(int i = 1; i <= s.length(); i++) {
                String frontPart = s.substring(0, i);
                String backPart = s.substring(i, s.length());
                if(wordDict.contains(frontPart)) {
                    sb.append(frontPart);
                    sb.append(" ");
                    findAllWordBreak(res, sb, backPart, wordDict);
                    sb.setLength(sb.length() - 1 - frontPart.length());
                }
            }
        }
        
         private boolean canWordBreak(String s, Set<String> wordDict) {     //Word Break I
            if(s == null || wordDict == null)
                return false;
            if(s.length() == 0)
                return true;
            
            for(int i = 1; i <= s.length(); i++) {
                String frontPart = s.substring(0, i);
                String backPart = s.substring(i, s.length());
                if(wordDict.contains(frontPart)) {
                    if(canWordBreak(backPart, wordDict))
                        return true;
                    wordDict.remove(frontPart);
                }
            }
            
            return false;
        }
    }

    Reference:

    https://leetcode.com/discuss/27464/my-concise-answer

    https://leetcode.com/discuss/23770/slightly-modified-dp-java-solution

    https://leetcode.com/discuss/7439/this-accepted-java-version-program-there-any-better-solution

    https://leetcode.com/discuss/133/is-there-better-solution-for-this-word-breakii

    http://www.cnblogs.com/springfor/p/3877056.html

    http://blog.csdn.net/linhuanmars/article/details/22452163

    http://www.programcreek.com/2014/03/leetcode-word-break-ii-java/

    http://www.acmerblog.com/word-break-ii-6128.html 

  • 相关阅读:
    观察者模式股票提醒
    中介者模式虚拟聊天室
    模板方法模式数据库的连接
    职责链模式财务审批
    期末总结
    软件需求分析考试
    tomcat启动极其慢的解决方法困扰我一年多的问题终于解决
    状态模式银行账户
    解释器模式
    动态加载JS文件提升访问网站速度
  • 原文地址:https://www.cnblogs.com/yrbbest/p/4438816.html
Copyright © 2020-2023  润新知