• Word Ladder 未完成


    Given two words (beginWord and endWord), and a dictionary, 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 intermediate word must exist in the dictionary

    For example,

    Given:
    start = "hit"
    end = "cog"
    dict = ["hot","dot","dog","lot","log"]

    As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
    return its length 5.

    Note:

      • Return 0 if there is no such transformation sequence.
      • All words have the same length.
      • All words contain only lowercase alphabetic characters.

    每次只能改变一个字符,求最短路径。

    开始想法为列出二维矩阵,找出变化一次,变化两次,知道变化为end,从而求最短路径。然而发现需要内存过多,同时超时。

    改为采用BFS,这样首先找到的肯定是最短路径。但是同样超时。看到网上都是用java实现的,不知道是什么问题。

     1 class Solution {
     2 private:
     3     int isOneDiff(string beginWord, string endWord)
     4     {
     5         int n=beginWord.size();
     6         int m=endWord.size();
     7         if(n!=m) return -1;
     8         int count=0;
     9         for(int i=0;i<n;i++)
    10         {
    11             if(beginWord[i]!=endWord[i])
    12                 count++;
    13             
    14         }
    15         if(count>1) return -1;
    16         return count;
    17     }
    18 public:
    19     int ladderLength(string beginWord, string endWord, unordered_set<string>& wordDict) {
    20         int n=wordDict.size();
    21         if(beginWord.empty()||endWord.empty()||n<1||beginWord.size()!=endWord.size()||isOneDiff(beginWord,endWord)==0)
    22             return 0;
    23         if(isOneDiff(beginWord,endWord)==1)
    24             return 2;
    25         if((wordDict.find(beginWord)!=wordDict.end())&&(wordDict.find(endWord)!=wordDict.end())&&(n==2))
    26             return 0;
    27         queue<string> q;
    28         map<string,int> wordmap;
    29         int wordlength=beginWord.size();
    30         int count=1;
    31         q.push(beginWord);
    32         wordmap.insert(pair<string,int>(beginWord,count));
    33         while(!q.empty())
    34         {
    35             string tmpword=q.front();
    36             count=wordmap[tmpword];
    37             q.pop();
    38             for(int i=0;i<wordlength;i++)
    39             {
    40                 
    41                 for(char j='a';j<='z';j++)
    42                 {
    43                     if(j==tmpword[i]) continue;
    44                     tmpword[i]=j;
    45                     if(tmpword==endWord) return count+1;
    46                     if(wordDict.find(tmpword)!=wordDict.end()) 
    47                     {
    48                         q.push(tmpword);
    49                         wordmap.insert(pair<string,int>(tmpword,count+1));
    50                     }
    51                 }
    52             }
    53         }
    54         
    55         return 0;
    56     }
    57 };
  • 相关阅读:
    开发培训体会——写好代码的一些编码规则和设计原则
    开发培训体会——写好代码的一些基本原理
    传说中的奖励通报
    NetBeans 6.7 Milestone 2 Now Available for Download!
    Software Process Engine of BeyondTrack
    开发培训体会——代码的价值
    NetBeans 6.7 Milestone 2 Now Available for Download!
    传说中的奖励通报
    有关_sprintf函数重定义错误的思考
    Software Process Engine of BeyondTrack
  • 原文地址:https://www.cnblogs.com/zl1991/p/4712174.html
Copyright © 2020-2023  润新知