• LeetCode //C - 127. Word Ladder


    127. Word Ladder

    A transformation sequence from word beginWord to word endWord using a dictionary wordList is a sequence of words beginWord -> s1 -> s2 -> … -> sk such that:

    • Every adjacent pair of words differs by a single letter.
    • Every si for 1 <= i <= k is in wordList. Note that beginWord does not need to be in wordList.
    • sk == endWord

    Given two words, beginWord and endWord, and a dictionary wordList, return the number of words in the shortest transformation sequence from beginWord to endWord, or 0 if no such sequence exists.
     

    Example 1:

    Input: beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]
    Output: 5
    Explanation: One shortest transformation sequence is “hit” -> “hot” -> “dot” -> “dog” -> cog", which is 5 words long.

    Example 2:

    Input: beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”]
    Output: 0
    Explanation: The endWord “cog” is not in wordList, therefore there is no valid transformation sequence.

    Constraints:
    • 1 <= beginWord.length <= 10
    • endWord.length == beginWord.length
    • 1 <= wordList.length <= 5000
    • wordList[i].length == beginWord.length
    • beginWord, endWord, and wordList[i] consist of lowercase English letters.
    • beginWord != endWord
    • All the words in wordList are unique.

    From: LeetCode
    Link: 127. Word Ladder


    Solution:

    Ideas:
    1. Start with beginWord “hit” and level 1.
    • Queue = [“hit”]
    1. Dequeue “hit” and explore its neighbors:
    • Check each word in wordList to find neighbors of “hit” (words that are one letter different and unvisited).
    • “hot” is a neighbor. Mark “hot” as visited and enqueue it.
    • Queue = [“hot”]
    • Increase level to 2.
    1. Dequeue “hot” and explore its neighbors:
    • Find neighbors of “hot” (unvisited words in wordList that are one letter different).
    • “dot” and “lot” are neighbors. Mark them as visited and enqueue them.
    • Queue = [“dot”, “lot”]
    • Increase level to 3.
    1. Dequeue “dot” and explore its neighbors:
    • Find neighbors of “dot”.
    • “dog” is a neighbor. Mark “dog” as visited and enqueue it.
    • Queue = [“lot”, “dog”]
    1. Dequeue “lot” and explore its neighbors:
    • Find neighbors of “lot”.
    • “log” is a neighbor. Mark “log” as visited and enqueue it.
    • Queue = [“dog”, “log”]
    • Increase level to 4.
    1. Dequeue “dog” and explore its neighbors:
    • Find neighbors of “dog”.
    • “cog” is a neighbor. Mark “cog” as visited and enqueue it.
    • Queue = [“log”, “cog”]
    1. Dequeue “log” and explore its neighbors:
    • Find neighbors of “log”.
    • No unvisited neighbors.
    • Queue = [“cog”]
    1. Dequeue “cog” and explore its neighbors:
    • “cog” is the endWord.
    • Return level which is 5, representing the shortest transformation sequence: “hit” -> “hot” -> “dot” -> “dog” -> “cog”.
    Code:
    bool isOneLetterDiff(char *a, char *b) {
        int diffCount = 0;
        while (*a) {
            if (*(a++) != *(b++)) diffCount++;
            if (diffCount > 1) return false;
        }
        return diffCount == 1;
    }
    
    int ladderLength(char *beginWord, char *endWord, char **wordList, int wordListSize) {
        if (!beginWord || !endWord || !wordList || wordListSize == 0) return 0;
        
        bool *visited = (bool *)calloc(wordListSize, sizeof(bool));
        char **queue = (char **)malloc(sizeof(char *) * (wordListSize + 1));
        int front = 0, rear = 0;
        
        queue[rear++] = beginWord;
        int level = 1;
        
        while (front < rear) {
            int size = rear - front;
            for (int i = 0; i < size; i++) {
                char *word = queue[front++];
                if (strcmp(word, endWord) == 0) {
                    free(visited);
                    free(queue);
                    return level;
                }
                for (int j = 0; j < wordListSize; j++) {
                    if (!visited[j] && isOneLetterDiff(word, wordList[j])) {
                        visited[j] = true;
                        queue[rear++] = wordList[j];
                    }
                }
            }
            level++;
        }
        
        free(visited);
        free(queue);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
  • 相关阅读:
    微信小程序第三方插件申请
    MVP 聚技站|.NET C# 系列(二):创建并运行简单的 C# 控制台应用程序
    记一次线上 Spring CPU 高负载的解决思路
    c++ 之安装opencv显示图片
    SpringBoot 整合Nacos配置中心
    仿京东放大镜效果(pink老师版)
    新晋技术管理者如何推动组织变革?
    牛客前端刷题(五)—— CSS相关概念
    【Scheme】Scheme 编程学习 (六) —— lambda 函数
    将小部分源码设计精髓带入到开发中来(工厂模式、适配器模式、抽象类、监听器)
  • 原文地址:https://blog.csdn.net/navicheung/article/details/133375373