知识点
本题主要考察DFS和dp以及集合方法的使用
解题思路
- 首先,我们首先我们应该想到,程序中应该会有大量的集合包含判定,使用hash算法再合适不过了,这里使用了HashSet将替换String[]。
- 方法抽取,虽然很细节,但是可以使你思路更清晰。
- 深度优先搜索:先从index=0往后找,匹配到子单词后,index后移,接着搜索后面部分,如果搜索失败就返回,成功继续搜索,直到index移动到单词最右端返回true,全部搜索完成没有匹配项就返回false。
解答:
class Solution {
public List<String> findAllConcatenatedWordsInADict(String[] words) {
Set<String> allwords = new HashSet<String>();
List<String> res = new ArrayList<String>();
for(String word:words){
allwords.add(word);
}
for(String word:words){
if(Concatenated(word,0,allwords,0))
res.add(word);
}
return res;
}
public boolean concatenated(String word,int index,Set<String> allwords,int currentNum){
if(index>=word.length()&¤tNum>=2)
return true;
for(int i = index;i<word.length();i++){
if(allwords.contains(word.substring(index,i+1))){
if(concatenated(word,i+1,allwords,currentNum+1))
return true;
}
}
return false;
}
}