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<String> dict) {
StringBuilder sb = new StringBuilder();
return helper(s, dict, 0, sb);
}
private boolean helper(String s, Set<String> dict, int index, StringBuilder sb) {
if (index == dict.size()) {
return s.equals(sb.toString());
}
Iterator<String> 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<String> dict) {
StringBuilder sb = new StringBuilder();
return helper(s, dict, 0, sb);
}
private boolean helper(String s, Set<String> dict, int index, StringBuilder sb) {
if (!s.startsWith(sb.toString())) {
return false;
}
if (index == dict.size()) {
return s.equals(sb.toString());
}
Iterator<String> 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<String> 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)是可以分割的,所示数组最后一个元素即为所求。
原文:http://blog.csdn.net/my_jobs/article/details/44245765