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"
.
方法跟 Palindrome Partitioning II 基本一样
possible [ i ] 用来记录前 i 个元素 是不是都是dict的。
isWord[ i ][ j ] 用来记录 string 的 从 i 到 j 位置是不是在 dict 里面
里面一点可以优化的地方 是求出 dict 里面最长单词的长度,用来作为边界条件。
public class Solution {
public boolean wordBreak(String s, Set<String> dict) {
if (s == null || s.length() ==0) {
return false;
}
int l = s.length();
boolean[] possible = new boolean[l + 1];
possible[0] = true;
int maxLength = longest(dict);
boolean[][] inDict = isWord(s, maxLength, dict);
for (int i = 0; i < l; i++) {
for(int j = 0; j <=maxLength; j++) {
if (j > i ) {
break;
}
if (possible[i - j] &&inDict[i - j][i]) {
possible[i+1] = true;
break;
}
}
}
return possible[l];
}
private boolean[][] isWord(String s, int maxLength, Set<String> dict) {
boolean[][] res = new boolean[s.length()][s.length()];
for (int i = 0; i < s.length(); i++) {
for (int j = 1; j <= maxLength; j++) {
if (i + j > s.length()){
break;
}
res[i][i+j-1] = dict.contains(s.substring(i,i+j ));
}
}
return res;
}
private int longest (Set<String> dict) {
int res = 0;
for (String word: dict) {
res = Math.max(res,word.length());
}
return res;
}
}
第二次写:
public class Solution {
public boolean wordBreak(String s, Set<String> dict) {
if (dict == null || dict.size() == 0) {
return false;
}
boolean[] result = new boolean[s.length() + 1];
result[0] = true;
for (int i = 0; i < s.length(); i++) {
for (int j = 0; j <= i; j++) {
if (result[j] && dict.contains(s.substring(j, i + 1))) {
result[i + 1] = true;
break;
}
}
}
return result[s.length()];
}
}