给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
- 拆分时可以重复使用字典中的单词。
- 你可以假设字典中没有重复的单词。
思路 :
使用一个数组dn[i],表示i之前的字符串能够被拆分成每个都在字典中的单词,那么对于i<j的dn[i]和dn[j]只需要判断i到j的单词是否能够被查询到,有以下式子:
dn[i]=dn[j] & if s.substring(i,j) in dict
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
Map<String,String> dict = new HashMap<>();
int maxlen=0;
for(String str:wordDict){
dict.put(str," ");
if(str.length()>maxlen){maxlen=str.length();}
}
//判断dn[i]=dn[j]&&s.substring(j,i) in wordDict;
//dn[i]表示能拆分成字典里的词
boolean[] dn = new boolean[s.length()+1];
dn[0]=true;
for(int i=1;i<=s.length();i++){
for(int j=i-1;j>=0&&(i-j)<=maxlen;j--){
String tmp = s.substring(j,i);
boolean con = dict.containsKey(tmp);
dn[i]=dn[j]&con;
if(dn[i]){break;}
}
}
return dn[s.length()];
}
}