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".
For example, given
s = "leetcode",
dict = ["leet", "code"].
Return true because "leetcode" can be segmented as "leet code".
题目意思 : 将字符串分开,但是划分后的子串必须是dict集合中的元素!
当时看错了题目,以为dict中的所有元素组合成s
public class Solution {
// 注意这里是一个set集合,也就是说,不会有重复的元素
public boolean wordBreak(String s, Set<String> dict) {
int len = s.length();
if (len == 0) return true;
int size = dict.size();
if (size == 0) return false;
// 他来记录j位前的元素都匹配
boolean[] flag = new boolean[len + 1];
flag[0] = true;
// 注意这里利用了substring(j , i) 截取的字符串为 j -> i-1 , 所以 i+1
for (int i = 1 ; i <= len ; i++) {
for (int j = 0 ; j < i ; j++) {
if (flag[j] && dict.contains(s.substring(j ,i))) {
flag[i] = true;
break;
}
}
}
return flag[len];
}
}
Discuss 中另一种方法:
备忘的方法 :
public Set<String> unmatch=new HashSet<String>(); // 这个集合用来记录不匹配的
public boolean wordBreak(String s, Set<String> dict) {
if(s.length()==0){
return true;
}
int count=s.length();
// 如果s不匹配,那么后面的递归调用就不会进行!
if (unmatch.contains(s)){
return false;
}
for(int i=1;i<=count;i++){
if(dict.contains(s.substring(0,i))&&wordBreak(s.substring(i,count),dict)){
return true;
}
}
unmatch.add(s);
return false;
}
}