dp篇
有意思的思路:
取s的前缀,就是说前i个字符是否在字符串数组里面即可。
常规思路是从字符串中随机组合来匹配,这样肯定很复杂。。
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
int n=s.length();
//将单词放入哈希表
HashSet<String> set=new HashSet<>();
set.addAll(wordDict);
//统计每个单词的长度
List<Integer>lens=new ArrayList<>();
for(String str:wordDict){
lens.add(str.length());
}
Collections.sort(lens);
boolean[] f=new boolean[n+1];
f[0]=true;
//从最小的长度开始判断
int minlen=lens.get(0);
for(int i=minlen;i<=n;i++){
//如果已经匹配成功
if(f[i]) continue;
for(int len:lens){
if(i-len>=0){
f[i] |= f[i-len]&&(set.contains(s.substring(i-len,i)));
}
}
}
return f[n];
}
}