zoukankan      html  css  js  c++  java
  • [LeetCode 127] Word Ladder

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

    http://www.lintcode.com/zh-cn/problem/word-ladder/

    给出两个单词(start和end)和一个字典,找到从start到end的最短转换序列

    比如:

    1. 每次只能改变一个字母。
    2. 变换过程中的中间单词必须在字典中出现。

    样例

    给出数据如下:

    start = "hit"

    end = "cog"

    dict = ["hot","dot","dog","lot","log"]

    一个最短的变换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog",

    返回它的长度 5

    注意

    • 如果没有转换序列则返回0。
    • 所有单词具有相同的长度。
    • 所有单词都只包含小写字母。
    // --------------------------- 
    //  BFS non-recursive method
    // ---------------------------
    //
    //    Using BFS instead of DFS is becasue the solution need the shortest transformation path.
    //  
    //    So, we can change every char in the word one by one, until find all possible transformation.
    //
    //    Keep this iteration, we will find the shorest path.
    //
    // For example:
    //   
    //     start = "hit"
    //     end = "cog"
    //     dict = ["hot","dot","dog","lot","log","dit","hig", "dig"]
    //
    //                      +-----+                  
    //        +-------------+ hit +--------------+   
    //        |             +--+--+              |   
    //        |                |                 |   
    //     +--v--+          +--v--+           +--v--+
    //     | dit |    +-----+ hot +---+       | hig |
    //     +--+--+    |     +-----+   |       +--+--+
    //        |       |               |          |   
    //        |    +--v--+         +--v--+    +--v--+
    //        +----> dot |         | lot |    | dig |
    //             +--+--+         +--+--+    +--+--+
    //                |               |          |   
    //             +--v--+         +--v--+       |   
    //        +----> dog |         | log |       |   
    //        |    +--+--+         +--+--+       |   
    //        |       |               |          |   
    //        |       |    +--v--+    |          |   
    //        |       +--->| cog |<-- +          |   
    //        |            +-----+               |   
    //        |                                  |   
    //        |                                  |   
    //        +----------------------------------+   
    //     
    //     1) queue <==  "hit"
    //     2) queue <==  "dit", "hot", "hig"
    //     3) queue <==  "dot", "lot", "dig"
    //     4) queue <==  "dog", "log" 
    // 
    
    class Solution {
    public:
        int ladderLength(string beginWord, string endWord, unordered_set<string>& wordDict) {
            unordered_map<string, int> dis;
            dis.insert(make_pair(beginWord, 1));
            
            queue<string> q;
            q.push(beginWord);
            
            while (!q.empty()) {
                string word = q.front();
                q.pop();
                
                if (word == endWord) {
                    break;
                }
                
                for (int i = 0; i < word.size(); i++) {
                    string tmp = word;
                    for (char c = 'a'; c <= 'z'; c++) {
                        tmp[i] = c;
                        if (wordDict.count(tmp) == 1 && dis.count(tmp) == 0) {
                            q.push(tmp);
                            dis.insert(make_pair(tmp, dis[word] + 1));
                        }
                    }
                }
            }
            
            if (dis.count(endWord) == 0) {
                return 0;
            } else {
                return dis[endWord];
            }
            
        }
    };
  • 相关阅读:
    面向对象静态语言的模型
    语言的静态分析技术
    面向对象的核心元素与机制
    Lua 笔记
    Linux配置系统
    Linux文件类型
    Wijmo 日历插件
    窗外大雨,心里小雨
    一次胆战心惊的服务器经历
    一次胆战心惊的服务器经历
  • 原文地址:https://www.cnblogs.com/jianxinzhou/p/4515287.html
Copyright © 2011-2022 走看看