Question 2 Word Ladder kBFS version

  • 如果你这一层的点题目没有要求谁先谁后的expand,不一定要用Queue这个媒介,可以直接用个List,Set

  • BiD-BFS我们在A测需要知道A侧走到的点在不在B侧的范围内,B侧走到的点在不在A侧的访问内

    • look up operation : Set >>> Queue

public int ladderLength(String beginWord, String endWord, List<String> wordList) {
    Set<String> wordSet = new HashSet<wordList>;
    // assume startWord, endWord all Valid and endWord inside the wordList
    
    wordSet.remove(endWord);
    wordSet.remove(beginWord);
    
    Set<String> forwardQueue = new HashSet<>();
    Set<String> backwardQueue = new HashSet<>();
    forwardQueue.add(beginWord);
    backwardQueue.add(endWord);
    
    int level = 1;
    while(!forwardQueue.isEmpty() && !backwardQueue.isEmpty()) {
        // 特别标准的点图里面,你走一步,我走一步,双侧都是等分支数,等量节点
        // 永远从少的那边走就好了
        if (forwardQueue.size() > backwardQueue.size()) {
            Set temp = forwardQueue;
            forwardQueue = backwardQueue;
            backwardQueue = temp;
        }
        level++;
        
        Set<String> forwardMutation = new HashSet<>();
        for (String word: forwardQueue) {
            // generate word 的neighbor,check这个neighbo是不是合法且对方有没有访问过
            char[] wordChar = word.toCharArray();
            for (int i = 0; i < wordChar.length; i++)  {
                char original = wordChar[i];
                for (char c = 'a'; c <= 'z'; c++) {
                    if (c == original) continue;
                    wordChar[i] = c;
                    String mutation = new String(wordChar);
                    if (backwardQueue.contains(mutation)) {
                        return level;
                    }
                    if (wordSet.contains(mutation)) {
                        forwardMutation.add(mutation);
                        wordSet.remove(mutation);
                    }
                }
                wordChar[i] = original;
            }
        }
        forwardQueue  = forwardMutation;
    }
    return 0;
}

Last updated