[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

posted @ 2014-07-07 01:12  jdflyfly  阅读(212)  评论(0编辑  收藏  举报