zoukankan      html  css  js  c++  java
  • (BFS 图的遍历的升级版) leetcode 127. Word Ladder

    Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest transformation sequence from beginWord to endWord, such that:

    1. Only one letter can be changed at a time.
    2. Each transformed word must exist in the word list. Note that beginWord is not a transformed word.

    Note:

    • Return 0 if there is no such transformation sequence.
    • All words have the same length.
    • All words contain only lowercase alphabetic characters.
    • You may assume no duplicates in the word list.
    • You may assume beginWord and endWord are non-empty and are not the same.

    Example 1:

    Input:
    beginWord = "hit",
    endWord = "cog",
    wordList = ["hot","dot","dog","lot","log","cog"]
    
    Output: 5
    
    Explanation: As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
    return its length 5.
    

    Example 2:

    Input:
    beginWord = "hit"
    endWord = "cog"
    wordList = ["hot","dot","dog","lot","log"]
    
    Output: 0
    
    Explanation: The endWord "cog" is not in wordList, therefore no possible transformation.

    ----------------------------------------------------------------------------------------------------------------------

    我发现我现在实力很弱,得更加努力了。

    这个题是说的就是把一个字符串改变其中一个字符,并且保证改变后的字符串再给定的一个字典上有,然后,如果最后改得到的字符串时符合要求的字符串,统计改变的次数,否则返回0. 和图的遍历类似,只是每次要遍历26个字符,用BFS最合适。

    参考链接:http://www.cnblogs.com/grandyang/p/4539768.html(强烈推荐这个大佬)

    C++代码:

    class Solution {
    public:
        int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
            unordered_set<string> wordset(wordList.begin(),wordList.end());  //建立一个字典。
            if(!wordset.count(endWord)) return 0;  //如果endWord不在字典上,那无论改多少次,都不能得到这个字符串。
            queue<string> q;
            q.push(beginWord);
            int res = 0;
            while(!q.empty()){
                for(int k = q.size(); k > 0; k--){
                    string word = q.front(); q.pop();
                    if(word == endWord) return res + 1;
                    for(int i = 0; i < word.size(); i++){
                        string newword = word;
                        for(char ch = 'a'; ch <= 'z';ch++){
                            newword[i] = ch;
                            if(wordset.count(newword) && newword!=word){
                                q.push(newword);
                                wordset.erase(newword);  //由于转变后得到的字符串不能与前面的相同,所以得在字典上删除相应的字符串。
                            } 
                        }
                    }
                }
                ++res;
            }
            return 0;
        }
    };
  • 相关阅读:
    所谓guard进程不能启动
    文件拒绝访问
    (转)Android 自定义 spinner (背景、字体颜色)
    (转)安装Android SDK时遇到Failed to rename directory
    (转)Download interrupted: Connection to https://dl-ssl.google.com refused
    安卓中Activity的onStart()和onResume()的区别是什么
    Could not find class 'org.ksoap2.serialization.SoapObject
    Android三种左右滑动效果 手势识别(转)
    The method of type must override a superclass method解决方式(转)
    MySQL插入中文时出现ERROR 1406 (22001): Data too long for column 'name' at row 1 (转)
  • 原文地址:https://www.cnblogs.com/Weixu-Liu/p/10812885.html
Copyright © 2011-2022 走看看