zoukankan      html  css  js  c++  java
  • leetcode 127 wordladder

    给定一个开头单词beginWord,一个结尾单词endWord,一个单词列表wordList,其中beginWord不在wordList中,而endWord在wordList中,这些单词都是等长的;

    一个单词的一次转变表示其中的一个字母改变;所有转变的单词都在wordList中,试求从beginWord到endWord的最短路径长度;没有返回0;

    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

    广度优先搜索,先找到所有列表中一次能到达的单词,然后根据这些单词找到两次能到达的单词,直到找到为止

    class Solution {
    public:
        bool judgeOneLetterDiffBetweenTwoWords(string firstword, string secondword){
            int difftime = 0, len1 = firstword.length(), len2 = secondword.length();
            if(len1 != len2){
                return false;
            }
            if(len1 == 0){
                return true;
            }
            char tmp1 = '',tmp2 = '';
            for(int i=0;i<len1;i++){
                tmp1 = firstword[i];
                tmp2 = secondword[i];
                if(tmp1 != tmp2){
                    difftime++;
                    if (difftime > 1){
                        return false;
                    }
                }
            }
            if(difftime == 1){
                return true;
            }
            return false;
        }
        int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
            set<string> set_available(wordList.cbegin(), wordList.cend());
            vector<string> l1, l2;
            int num_ceng = 1;
            string tmp = "", tmp2 = "";
            bool tmp3 = false;
            l1.push_back(beginWord);
            while(!l1.empty() && !set_available.empty()){
                num_ceng++;
                vector<string>::iterator it = l1.begin();
                //遍历该层的单词
                while(it != l1.end()){
                    tmp = *it;
                    set<string>::iterator set_it = set_available.begin();
                    //遍历set
                    while(set_it != set_available.end()){
                        tmp2 = *set_it;
                        tmp3 = judgeOneLetterDiffBetweenTwoWords(tmp, tmp2);
                        if (tmp3 == true){
                            if (tmp2 == endWord){
                                return num_ceng;
                            }
                            l2.push_back(tmp2);
                            set_it = set_available.erase(set_it);
                        }else{
                            set_it++;
                        }
                    }
                    it++;
                }
                // l1 = l2;
                swap(l1, l2);
                l2.clear();
            }
            return 0;
        }
    };

    算法复杂度O(N^2)打败了10%的人,感觉有待改进的地方

  • 相关阅读:
    [Javascript] Avoid Creating floats if they are not needed
    App_Offline.htm and working around the "IE Friendly Errors" feature
    uninstall vs extension
    Sample page with dom-if and dom-bind in polymer
    4 classes in Bootstrap Grid system
    Suppress user properties/ custom fields when print in Outlook
    Remove Event Handler via Reflection
    Get the type name of a com object
    Row_Number 生成样本数据
    java运行命令行或脚本
  • 原文地址:https://www.cnblogs.com/mangmangbiluo/p/11002061.html
Copyright © 2011-2022 走看看