code

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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值