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 };
复制代码

 

posted @   鸭子船长  阅读(175)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示