beginWord = “hit”
endWord = “cog”
wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]
返回:
[
[“hit”,“hot”,“dot”,“dog”,“cog”],
[“hit”,“hot”,“lot”,“log”,“cog”]
]
public class Code_06_Word_Ladder {
public static List<List<String>> findLadders(String beginWord,String endWord,List<String> words){
words.add(beginWord);
HashMap<String,ArrayList<String>> nexts = getNexts(words);
HashMap<String,Integer> distances = getDistances(beginWord,nexts);
LinkedList<String> pathList = new LinkedList<>();
List<List<String>> res = new ArrayList<>();
getShortestPaths(beginWord,endWord,nexts,distances,pathList,res);
return res;
}
public static void getShortestPaths(String cur,String end,
HashMap<String,ArrayList<String>> nexts,
HashMap<String,Integer> distances,
LinkedList<String> solution,
List<List<String>> res){
//加单词到solution里面
solution.add(cur);
if (end.equals(cur)){
res.add(new LinkedList<String>(solution));
}else{
for (String next : nexts.get(cur)){
//
if (distances.get(next) == distances.get(cur) + 1){
getShortestPaths(next,end,nexts,distances,solution,res);
}
}
}
solution.pollLast();
}
public static HashMap<String,Integer> getDistances(String begin, HashMap<String,ArrayList<String>> nexts){
HashMap<String,Integer> distances = new HashMap<>();
distances.put(begin,0);
//进行广度遍历的辅助工具
Queue<String> queue = new LinkedList<String>();
queue.add(begin);
//用于判断单词的唯一性
HashSet<String> set = new HashSet<>();
set.add(begin);
while (!queue.isEmpty()){
String cur = queue.poll();
for (String str : nexts.get(cur)){
if (!set.contains(str)){
distances.put(str,distances.get(cur) + 1);
queue.add(str);
set.add(str);
}
}
}
return distances;
}
//给所有字典的单词找到与其相差一个字母的单词
public static HashMap<String,ArrayList<String>> getNexts(List<String> words){
Set<String> dict = new HashSet<>(words);
HashMap<String,ArrayList<String>> nexts = new HashMap<>();
for (int i = 0; i < words.size(); i++) {
nexts.put(words.get(i),new ArrayList<>());
}
for (int i = 0; i < words.size(); i++) {
nexts.put(words.get(i),getNext(words.get(i),dict));
}
return nexts;
}
public static ArrayList<String> getNext(String word, Set<String> dict){
ArrayList<String> res = new ArrayList<>();
char[] chs = word.toCharArray();
for (char cur = 'a'; cur <= 'z';cur++){
for (int i = 0;i < chs.length;i++){
//找出与word相差一个字母的并且在dict里面的所有单词,并且将其加到ArrayList
if (chs[i] != cur){
char tmp = chs[i];
chs[i] = cur;
if (dict.contains(String.valueOf(chs))){
res.add(String.valueOf(chs));
}
chs[i] = tmp;
}
}
}
return res;
}
//测试
public static void main(String[] args) {
String begin = "hit";
String end = "cog";
List<String> wordList = new ArrayList<>();
wordList.add("hot");
wordList.add("dot");
wordList.add("dog");
wordList.add("lot");
wordList.add("log");
wordList.add("cog");
List<List<String>> lists = findLadders(begin, end, wordList);
System.out.println(lists);
}
}
来源:https://blog.csdn.net/Mr_wangr/article/details/99604624