描述
给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词。
样例
给出
s = "lintcode"
dict = ["lint","code"]
返回 true 因为"lintcode"可以被空格切分成"lint code"
思路
这道题其实是一个字符串匹配+动态规划问题,它的子问题结构还是比较容易看出来的。
首先定义 dp[i] : 到字符串s的第i个位置都可以匹配。
子问题为: dp[i] = dp[i-len] + { s.subString(i-len,i) 是否在dict中 }。
即如果前i-len可以正确匹配,后面i-len+1到i的字串又在字典dict中,则前i个字符也可以正确匹配。
但是这边有一个注意点,就是我们有必要 每次从 0 位置开始遍历吗,不需要,我们只需要求出字典dict中最长的那个
字符串的长度就可以了。
代码
public static boolean wordBreak(String s, Set<String> dict) {
// write your code here
if(s==null || dict==null ){
return false;
}
int maxLen = 0;
for(String word:dict){
if(word.length()>maxLen){
maxLen = word.length();
}
}
boolean[] dp = new boolean[s.length()+1];
dp[0] = true;
for (int i = 1; i <= s.length(); i++) {
int start = i-maxLen>0?i-maxLen:0;
for (int j = start; j <= i; j++) {
if(dp[j] && dict.contains(s.substring(j,i))){
dp[i] = true;
break;
}
}
}
return dp[s.length()];
}