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) {
int length = s.length();
String sub = "";
for(int i = 1;i<length;i++){
sub = s.substring(0, i);
if(dict.contains(sub)) {
if(i == length) return true;
else if(wordBreak(s.substring(i),dict)) return true;
}
}
return false;
}
第二种解法:动态规划。
设置布尔记忆数组dp[i]表示s.substring(0,i+1)是否可以按照字典分解
根据前面的dp[i]求解出所有的dp[i],最后输出dp[length-1]
public boolean wordBreak(String s, Set<String> dict) {
int length = s.length();
boolean[] dp = new boolean[length];
for(int i = 0;i<length;i++){
dp[i] = isMatch(s.substring(0,i+1),dict);
if(!dp[i]){//如果前i个子串不能匹配,则将它再次分割
for(int j = 0;j<i;j++){
if(dp[j] && isMatch(s.substring(j+1,i+1),dict)){//如果前j个子串可以分割,则看后面的字串是否匹配,只要有一种情况可以匹配,则表示可以分割,即刻跳出循环
dp[i]=true;
break;
}
}
}
}
return dp[length-1];
}
public boolean isMatch(String sub, Set<String> dict){
if(dict.contains(sub)) return true;
return false;
}