1.题目
给定两个单词(开始和结束)和一个字典,从头到尾查找所有最短的变换序列,以便: 一次只能更改一个字母 每个中间词必须存在于词典中 例如,给定: start ="hit" end ="cog" dict =["hot","dot","dog","lot","log"] 返回: [ ["hit","hot","dot","dog","cog"], ["hit","hot","lot","log","cog"] ]
注:
所有单词具有相同的长度。
所有单词只包含小写字母字符。
2.分析过程
深度优先遍历DFS的应用。当然也可使用广度优先遍历BFS来做。
3.代码
import java.util.*;
public class Solution {
public ArrayList<ArrayList<String>> findLadders(String start, String end, HashSet<String> dict) {
ArrayList<ArrayList<String>> listAll=new ArrayList<>();
if(start==null || start.length()==0 || end==null || end.length()==0 || start.length()!=end.length())
return listAll;
ArrayList<String> list=new ArrayList<>();
list.add(start);
if(isSimlary(start,end)){
list.add(end);
listAll.add(list);
return listAll;
}else{
if(dict==null || dict.size()==0){
return listAll;
}
}
findLadders(start,end,dict,list,listAll);
int min=dict.size()+3;
for(int i=0;i<listAll.size();i++){
if(min>listAll.get(i).size()){
min=listAll.get(i).size();
}
}
ArrayList<ArrayList<String>> result=new ArrayList<>();
for(int i=0;i<listAll.size();i++){
if(listAll.get(i).size()==min){
result.add(listAll.get(i));
}
}
return result;
}
public void findLadders(String start,String end,HashSet<String> dict,ArrayList<String> list,ArrayList<ArrayList<String>> listAll){
ArrayList<String> temp=new ArrayList<>();
temp.addAll(list);
if(isSimlary(start,end)){
temp.add(end);
listAll.add(temp);
}else{
Iterator<String> it=dict.iterator();
while(it.hasNext()){
String str=it.next();
if(!list.contains(str) && isSimlary(temp.get(temp.size()-1),str)){
ArrayList<String> temp1=new ArrayList<>();
temp1.addAll(temp);
temp1.add(str);
findLadders(str,end,dict,temp1,listAll);
}
}
}
}
public boolean isSimlary(String start,String end){
int count=0;
for(int i=0;i<start.length();i++){
if(start.charAt(i)==end.charAt(i)) continue;
count++;
}
if(count==1) return true;
else return false;
}
}