zoukankan      html  css  js  c++  java
  • [leetcode] Word Break

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words.

    For example, given
    s = "leetcode",
    dict = ["leet", "code"].

    Return true because "leetcode" can be segmented as "leet code".

    https://oj.leetcode.com/problems/word-break/

    思路1:DFS。

    思路2:DP。dp[i]表示前i长度字符串能否成功分解。

    public class Solution {
        public boolean wordBreak(String s, Set<String> dict) {
            return wordBreakDP(s, dict);
        }
    
        private boolean wordBreakHelper(String s, Set<String> dict, int start) {
            if (start == s.length())
                return true;
    
            for (String each : dict) {
                int len = each.length();
                if (start + len > s.length())
                    continue;
    
                if (s.substring(start, start + len).equals(each)) {
                    if (wordBreakHelper(s, dict, start + len))
                        return true;
                }
    
            }
            return false;
        }
    
        private boolean wordBreakDP(String s, Set<String> dict) {
            int len = s.length();
            boolean[] dp = new boolean[len + 1];
            dp[0] = true;
    
            for (int i = 0; i < len; i++) {
                if (dp[i] == false)
                    continue;
    
                for (String each : dict) {
    
                    int end = i + each.length();
    
                    if (end > len)
                        continue;
    
                    if (dp[end] == true)
                        continue;
    
                    if (s.substring(i, end).equals(each))
                        dp[end] = true;
                }
    
            }
    
            return dp[len];
        }
    
        public static void main(String[] args) {
    
            String s = "abcd";
            String[] a = { "a", "abc", "b", "cd" };
            Set<String> dict = new HashSet<String>();
            for (String each : a)
                dict.add(each);
    
            System.out.println(new Solution().wordBreak(s, dict));
        }
    }

    第二次记录:

    dfs法果断超时

    public class Solution {
        public boolean wordBreak(String s, Set<String> dict) {
            return wordBreakHelper(s, dict, 0);
        }
    
        private boolean wordBreakHelper(String s, Set<String> dict, int start) {
            if (start == s.length())
                return true;
    
            for (String each : dict) {
                int len = each.length();
                if (s.substring(start).startsWith(each)) {
                    if (wordBreakHelper(s, dict, start + len))
                        return true;
                }
            }
    
            return false;
    
        }
        
    }

    dp法,学会用String的startsWith方法。

    public class Solution {
        public boolean wordBreak(String s, Set<String> dict) {
            return wordBreakDP(s, dict);
        }
        
        private boolean wordBreakDP(String s, Set<String> dict){
            int n= s.length();
            boolean[] dp = new boolean[n+1];
            dp[0]=true;
            
            for(int i=0;i<=n;i++){
                if(dp[i]==false)
                    continue;
                for(String each:dict){
                    if(s.substring(i).startsWith(each)){
                        dp[i+each.length()]=true;
                    }
                }
                
            }
            return dp[n];
        }
        
    }

    第三遍:

      dfs的方法换了一种,不过依然超时。

      DP的方法竟然不记得了,看了思路实现起来就简单多了。

    import java.util.HashSet;
    import java.util.Set;
    
    public class Solution {
        public boolean wordBreak(String s, Set<String> dict) {
            return wordBreakDP(s, dict);
        }
    
        private boolean wordBreakDfs(String s, Set<String> dict) {
            if ("".equals(s))
                return true;
    
            for (int i = 1; i <= s.length(); i++) {
                String left = s.substring(0, i);
                if (dict.contains(left)) {
                    if (wordBreakDfs(s.substring(i, s.length()), dict))
                        return true;
                }
            }
            return false;
        }
    
        private boolean wordBreakDP(String s, Set<String> dict) {
            int n = s.length();
            boolean[] dp = new boolean[n + 1];
            dp[0] = true;
    
            for (int i = 0; i < n; i++) {
                if (dp[i] == false)
                    continue;
                String tmp = s.substring(i);
                for (String each : dict) {
                    if (tmp.startsWith(each)) {
                        dp[i + each.length()] = true;
                    }
    
                }
    
            }
    
            return dp[n];
    
        }
    
        public static void main(String[] args) {
    
            String s = "leetcode";
            String[] a = { "leet", "code", "", "cd" };
            Set<String> dict = new HashSet<String>();
            for (String each : a)
                dict.add(each);
    
            System.out.println(new Solution().wordBreak(s, dict));
        }
    }

    参考:

    http://www.programcreek.com/2012/12/leetcode-solution-word-break/

    http://www.cnblogs.com/lautsie/p/3371354.html

  • 相关阅读:
    Yslow-23条规则
    ASP.Net MVC多语言
    Java笔记--反射机制
    Java笔记--常用类
    Java笔记--多线程
    Java--IO流
    Java笔记--枚举&注解
    Java笔记--泛型
    Java笔记--异常
    Java笔记--集合
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3828935.html
Copyright © 2011-2022 走看看