[LeetCode]Word Ladder

来源:互联网 发布:mysql服务安装失败 编辑:程序博客网 时间:2024/05/29 17:16

https://leetcode.com/problems/word-ladder/

开始以为是一个DFS问题,然后考虑建图。实际是BFS问题,并且搜索问题不一定需要建图!本题巧妙之处在于使用首尾两个set,同时始终保证BFS开始的Set是size较小的。维护一个visitedSet。遍历begSet,判断当前String变更一个位置之后是不是可以在endSet之中找到,如果可以,就返回结果。

实际相当于two pointer,要么beg++,要么end--,最终相遇位置就是走过的总长度。



public class Solution {    public int ladderLength(String beginWord, String endWord, Set<String> wordList) {        HashSet<String> begSet = new HashSet<>(), endSet = new HashSet<>(), visitedSet = new HashSet<>();        begSet.add(beginWord);        endSet.add(endWord);        int len = 2;        while (!begSet.isEmpty() && !endSet.isEmpty()) {            if (begSet.size() > endSet.size()) {                HashSet<String> set = begSet;                begSet = endSet;                endSet = set;            }            HashSet<String> tmp = new HashSet<>();            for (String cur : begSet) {                char[] arr = cur.toCharArray();                for (int i = 0; i < arr.length; i++) {                    for (char c = 'a'; c <= 'z'; c++) {                        char old = arr[i];                        arr[i] = c;                        String key = String.valueOf(arr);                        if (endSet.contains(key)) {                            return len;                        }                        if (!visitedSet.contains(key) && wordList.contains(key)) {                            tmp.add(key);                            visitedSet.add(key);                        }                        arr[i] = old;                    }                }            }            begSet = tmp;            len++;        }        return 0;    }}


0 0