LeetCode-Word Break

2015-07-20 17:10:35 来源: 作者: 浏览: 2

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

一看这题目,就感觉里面回溯法,因为这种题,在回溯法中在平常不过了。上代码:

public boolean wordBreak(String s, Set
  
    dict) {
    	StringBuilder sb = new StringBuilder();
        return helper(s, dict, 0, sb);
    }
    private boolean helper(String s, Set
   
     dict, int index, StringBuilder sb) { if (index == dict.size()) { return s.equals(sb.toString()); } Iterator
    
      iter = dict.iterator(); while (iter.hasNext()) { StringBuilder sb1 = new StringBuilder(sb); String dic = iter.next(); sb.append(dic); iter.remove(); if (helper(s, dict, index+1, sb)) return true; dict.add(dic); sb = sb1; } return false; }
    
   
  

结果超时!一般情况下,对于回溯的时间限制都是比较宽的,但是超时!肯定有优化的空间吧,剪枝啊:、

public boolean wordBreak(String s, Set
  
    dict) {
    	StringBuilder sb = new StringBuilder();
        return helper(s, dict, 0, sb);
    }
    private boolean helper(String s, Set
   
     dict, int index, StringBuilder sb) { if (!s.startsWith(sb.toString())) { return false; } if (index == dict.size()) { return s.equals(sb.toString()); } Iterator
    
      iter = dict.iterator(); while (iter.hasNext()) { StringBuilder sb1 = new StringBuilder(sb); String dic = iter.next(); sb.append(dic); iter.remove(); if (helper(s, dict, index+1, sb)) return true; dict.add(dic); sb = sb1; } return false; }
    
   
  
其实这个剪枝可以减去很多分支,但是还是超时!怎么办?只能用最高效的动态规划了,上代码:

public boolean wordBreak1(String s, Set
  
    dict) {
    	int length = s.length();
        boolean[] can = new boolean[length+1];
        can[0] = true;
        for (int i = 1; i <= length; i++) {
            for (int j = 0; j < i; j++) {
                if (can[j] && dict.contains(s.substring(j, i))) {
                    can[i] = true;
                    break;
                }
            }
        }
        return can[length];
    }
  
boolean数组can[i]是指,s.substring(0,i)是可以分割的,所示数组最后一个元素即为所求。






-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: