zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    读书笔记之理想设计的特征
    一些javascript 变量声明的 疑惑
    LINQ 使用方法
    Google MySQL tool releases
    读书笔记之设计的层次
    EF之数据库连接问题The specified named connection is either not found in the configuration, not intended to be used with the Ent
    转载 什么是闭包
    javascript面向对象起步
    Tips
    数据结构在游戏中的应用
  • 原文地址:https://www.cnblogs.com/yrbbest/p/4438816.html
Copyright © 2011-2022 走看看