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"
.
Solution1:
递归调用。
private Map<String, Boolean> map = new HashMap<String, Boolean>();
public boolean wordBreak(String s, Set<String> dict) {
if(dict.contains(s)) return true;
if(map.containsKey(s)) {
return map.get(s);
}
for(int i=0; i<s.length(); i++) {
String prefix = s.substring(0, i+1);
if(dict.contains(prefix)) {
String suffix = s.substring(i+1);
if(wordBreak(suffix, dict)) {
return true;
}
}
}
map.put(s, false);
return false;
}
Solution2:
动态规划。
f[i] = true if s[0,i]在dict里面
= true if f[k] == true 并且s[k+1,j]在dict里面,0<k<i
= false if no such k exist.
public boolean wordBreak(String s, Set<String> dict) {
int n = s.length();
boolean[] f = new boolean[n+1];
f[0] = true;
for(int i=1; i<=n; i++) {
for(int j=0; j<i; j++) {
String word = s.substring(j, i);
f[i] = f[j] && dict.contains(word);
if(f[i]) break;
}
}
return f[n];
}
Reference:
http://fisherlei.blogspot.com/2013/11/leetcode-word-break-solution.html