直接层序遍历,结果有部分测试样例超时;

class Solution {
public:
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
//利用二叉树的层序遍历;
if(beginWord.size()!=endWord.size()) return ;
unordered_map<string,int> h;
for(int i=;i<wordList.size();i++){
h[wordList[i]]=;
}
if(h[endWord]==) return ;
int level=;
queue<string> q;
q.push(beginWord); while(!q.empty()){
level++;
int qlen=q.size();
while(qlen--){
string front=q.front();
//cout<<front<<",";
q.pop();
for(int i=;i<wordList.size();i++){
if(h[wordList[i]]==) continue;
if(dis(front,wordList[i])==){
if(wordList[i]==endWord) return level;
q.push(wordList[i]);
h[wordList[i]]=;
}
}
}
//cout<<endl;
}
return ; }
int dis(string w1,string w2){
if(w1.size()!=w2.size()) return ;
int res=;
for(int i=;i<w1.size();i++){
res+=(w1[i]-w2[i]==)?:;
if(res>) return res;
}
return res;
}
};

究其原因,是因为距离计算每次都要调用函数过于复杂,由于两两单词间计算距离,并且计算距离时又需要对每个字母进行遍历,因此timeO(n^2*m)

改变距离的计算,对其做预处理,列出每个单词的状态,比如hog 可列为 *og,h*g,ho*;通过临接表来表示,即一个键值(key)为状态,值(value)为hog,即unordered_map<string,set<string>> m(单词状态,单词列表) 对n个词,每个词m个状态进行检索, time O(mn)级别,

C++代码如下:

class Solution {
public:
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
//处理边界情况;
if(beginWord.size()!=endWord.size() || wordList.size()== || wordList[].size()==) return ; int lr=wordList.size(),lc=wordList[].size(); //初始化哈希表h,记录访问情况;
unordered_map<string,int> h;
for(int i=;i<lr;i++){
h[wordList[i]]=;
} //预处理:初始化状态表m(状态,单词列表)
unordered_map<string,set<string> > m;
for(int i=;i<lr;i++){
for(int j=;j<lc;j++){
string tmp=wordList[i];
tmp[j]='*';
m[tmp].insert(wordList[i]);
}
} //BFS搜寻最短路径
int level=;
queue<string> q;
q.push(beginWord);
while(!q.empty()){
level++;
int qsize=q.size();
while(qsize--){
string front=q.front();
q.pop();
for(int i=;i<lc;i++){
string state=front;
state[i]='*'; for(string child: m[state]){ if(h[child]==) continue;
//cout<<child<<",";
if(child==endWord) return level;
h[child]=;
q.push(child);
}
}
}
//cout<<endl;
}
return ;
}
};

leetcode 137单词接龙的更多相关文章

  1. Leetcode 126.单词接龙II

    单词接龙II 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则: 每次转换只能 ...

  2. Java实现 LeetCode 127 单词接龙

    127. 单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字 ...

  3. Java实现 LeetCode 126 单词接龙 II

    126. 单词接龙 II 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则: ...

  4. leetcode 127 单词接龙

    给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字母. 转换过程中的中 ...

  5. [LeetCode] 126. 单词接龙 II

    题目链接 : https://leetcode-cn.com/problems/word-ladder-ii/ 题目描述: 给定两个单词(beginWord 和 endWord)和一个字典 wordL ...

  6. Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder)

    Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...

  7. LeetCode 126. Word Ladder II 单词接龙 II(C++/Java)

    题目: Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transfo ...

  8. NOIP2000单词接龙[DFS]

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  9. Noip2000 T3 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

随机推荐

  1. Python内置函数清单

    作者:Vamei 出处:http://www.cnblogs.com/vamei Python内置(built-in)函数随着python解释器的运行而创建.在Python的程序中,你可以随时调用这些 ...

  2. 使用shell脚本自动打包上传 fir.im

    http://blog.csdn.net/wang631106979/article/details/52299083

  3. microsoft office powerpoibt automation 二次开发

    背景 首先office的产品powerpoint是支持二次开发的,这里的二次开发并不是指在powerpoint产品中嵌入一些自己的控件,而是一些简单的automation的控制(进入放映状态,上一页, ...

  4. pip 报错找不到pip问题

    具体报错如下 解决办法: wget https://bootstrap.pypa.io/get-pip.py  --no-check-certificate 使用当前python3运行

  5. jQuery获取兄弟标签的文本

    // 一个div里面有一个span标签和多个button标签,每个button标签都有id,span标签没有id,通过点击其中一个button标签,来获取到span标签的text function ( ...

  6. 关于Mongodb的Cap理论的思考(转载)

    大约在五六年前,第一次接触到了当时已经是hot topic的NoSql.不过那个时候学的用的都是mysql,Nosql对于我而言还是新事物,并没有真正使用,只是不明觉厉.但是印象深刻的是这么一张图片( ...

  7. GoAccess安装及分析nginx实时日志

    GoAccess是一个基于终端的快速日志分析器.其核心思想是实时快速分析和查看Web服务器统计信息,而无需使用您的浏览器(如果您希望通过SSH快速分析访问日志,或者只是喜欢在终端中工作),终端输出是默 ...

  8. 关于深度学习之TensorFlow简单实例

    1.对TensorFlow的基本操作 import tensorflow as tf import os os.environ[" a=tf.constant(2) b=tf.constan ...

  9. k8s命令集锦

    集群环境相关命令$kubectl vertion --short=true #显示当前使用的客户端及服务端程序版本信息$kubectl cluster-info #获取集群信息$kubectl api ...

  10. JAVA基础编程之打印99乘法表

    需求:打印9*9乘法表 技术考核: 1.for嵌套循环 代码: // 打印99乘法表 public static void print99Table() { System.out.println(&q ...