leetcode 137单词接龙

直接层序遍历,结果有部分测试样例超时;
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单词接龙的更多相关文章
- Leetcode 126.单词接龙II
		单词接龙II 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则: 每次转换只能 ... 
- Java实现 LeetCode 127 单词接龙
		127. 单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字 ... 
- Java实现 LeetCode 126 单词接龙 II
		126. 单词接龙 II 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则: ... 
- leetcode 127 单词接龙
		给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字母. 转换过程中的中 ... 
- [LeetCode] 126. 单词接龙 II
		题目链接 : https://leetcode-cn.com/problems/word-ladder-ii/ 题目描述: 给定两个单词(beginWord 和 endWord)和一个字典 wordL ... 
- Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder)
		Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ... 
- LeetCode 126. Word Ladder II 单词接龙 II(C++/Java)
		题目: Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transfo ... 
- NOIP2000单词接龙[DFS]
		题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ... 
- Noip2000 T3 单词接龙
		题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ... 
随机推荐
- Linux使用Docker启动Elasticsearch并配合Kibana使用,安装ik分词器
			注意事项 这里我的Linux虚拟机的IP地址是192.168.1.3 Docker运行Elasticsearch容器之后不会立即有反应,要等一会,等待容器内部启动Elasticsearch,才可以访问 ... 
- web攻击日志分析之新手指南
			0x00 前言 现实中可能会经常出现web日志当中出现一些被攻击的迹象,比如针对你的一个站点的URL进行SQL注入测试等等,这时候需要你从日志当中分析到底是个什么情况,如果非常严重的话,可能需要调查取 ... 
- deep_learning_Function_tensorflow_unpack()
			tf.unpack(A, axis)是一个解包函数.A是一个需要被解包的对象,axis是一个解包方式的定义,默认是零,如果是零,返回的结果就是按行解包.如果是1,就是按列解包. 例如: from te ... 
- python中的else语句
			python语言和其它语言一样在支持else语句,通常else语句和if语句合用,完成程序的分支选择功能. 例如如下打印学成成绩代码: score = int(input("请输入成绩:&q ... 
- 使用putty对linux与windows之间的文件传输
			一.putty下载 首先下载pytty,解压开发现里面有plink.exe pscp.exe psftp.exe putty.exe puttygen.exe puttytel.exe等可执行文件 进 ... 
- Linux 性能优化笔记:软中断(转载)
			进程的不可中断状态是系统的一种保护机制,可以保证硬件的交互过程不被意外打断. 所以,短时间的不可中断状态是很正常的. 但是,当进程长时间都处于不可中断状态时,你就得当心了.这时,你可以使用 dstat ... 
- 【BZOJ1049】【Luogu P2501】 [HAOI2006]数字序列  DP,结论,LIS
			很有(\(bu\))质(\(hui\))量(\(xie\))的一个题目. 第一问:求最少改变几个数能把一个随机序列变成单调上升序列. \(Solution:\)似乎是一个结论?如果两个数\(A_i\) ... 
- Hibernate 缓存机制详细分析
			在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相 ... 
- string、wstring、CString 相互转换
			关于string wstring cstring的功能这里不详细叙述了 可参见这里:https://www.cnblogs.com/guolixiucai/p/4716521.html 关于转换这里只 ... 
- jquery radio选择器 语法
			jquery radio选择器 语法 作用::radio 选择器选取类型为 radio 的 <input> 元素.大理石平台价格表 语法:$(":radio") jqu ... 
