当前位置: 首页 > news >正文

[LeetCode 127] - 单词梯(Word Ladder)

问题

给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列的长度。规则如下:

  • 一次只能改变一个字母
  • 中间单词必须在字典里存在

例如:

给出

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

因为其中一条最短的转换序列为"hit" -> "hot" -> "dot" -> "dog" -> "cog",返回它的长度5。

注意

  • 如果不存在转换序列,返回0
  • 所有单词的长度一样
  • 所有单词中只有小写字母

 

初始思路

有了单词梯II的分析,本题就很容易实现了。这里我们选择双vector的方案来进行改造。需要注意的几点:

  • 只需要返回最短序列的长度,找到一个就可以返回了
  • 同样由于只需返回长度,不需要像单词梯II那样每过一层才能把用过的单词去掉,使用一次就可以去除了。
  • 每处理完一个vector表示一层处理结束,对当前序列长度加1

改造后的代码如下:

 1 class Solution {
 2 public:
 3     int ladderLength(std::string start, std::string end, std::unordered_set<std::string> &dict)
 4     {
 5         std::vector<std::unordered_set<std::string>> candidates(2);
 6         
 7         int current = 0;
 8         int previous = 1;
 9         int ladderLength = 1;
10         
11         candidates[current].insert(start);
12         dict.erase(start);
13         
14         while(true)
15         {
16             current = !current;
17             previous = !previous;
18             
19             candidates[current].clear();
20             
21             for(auto iter = candidates[previous].begin(); iter != candidates[previous].end(); ++iter)
22             {
23                 for(size_t pos = 0; pos < iter->size(); ++pos)
24                 {
25                     std::string word = *iter;
26                     for(int i = 'a'; i <= 'z'; ++i)
27                     {
28                         if(word[pos] == i)
29                         {
30                             continue;
31                         }
32                         
33                         word[pos] = i;
34                         
35                         if(dict.count(word) > 0)
36                         {
37                             if(word == end)
38                             {
39                                 return ladderLength + 1;
40                             }
41                             
42                             candidates[current].insert(word);
43                             dict.erase(word);
44                         }
45                     }
46                 }
47             }
48             ++ladderLength;
49             
50             if (candidates[current].size() == 0)
51             {
52                 return 0;
53             }
54         }
55         
56         return 0;
57     }
58 };
双vector BFS

提交后一次通过Judge Small和Judge Large。

转载于:https://www.cnblogs.com/shawnhue/archive/2013/06/06/leetcode_127.html

相关文章:

  • Intellij IDEA + Jrebel 双神器组合提高生产力
  • 【centos 】putty 登陆linux慢
  • WPF,Silverlight与XAML读书笔记第四十二 - 多媒体支持之音、视频和语音
  • C#公历转农历的简单方法
  • 与搜索引擎谈一场亲密的恋爱
  • Assemblies,Metadata and Runtime Services In C++/CLI
  • VC执行VBS脚本
  • 70个非常酷和时尚的iOS应用程序图标
  • C# 3.0语言特性
  • xcode中c语言scanf的问题
  • taobao开源项目
  • Vim升华之树形目录插件NERDTree安装图解
  • Manifest文件的配置
  • 最新JAVA编程题全集(50题及答案)
  • 强大的命令行工具wmic
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • ES10 特性的完整指南
  • js操作时间(持续更新)
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • markdown编辑器简评
  • Material Design
  • MySQL QA
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python_网络编程
  • 从PHP迁移至Golang - 基础篇
  • 多线程事务回滚
  • 前端学习笔记之观察者模式
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 在Unity中实现一个简单的消息管理器
  • 【云吞铺子】性能抖动剖析(二)
  • MyCAT水平分库
  • 阿里云服务器如何修改远程端口?
  • 大数据全解:定义、价值及挑战
  • 整理一些计算机基础知识!
  • ​力扣解法汇总946-验证栈序列
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • (1)常见O(n^2)排序算法解析
  • (poj1.3.2)1791(构造法模拟)
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (转)Android学习笔记 --- android任务栈和启动模式
  • **CI中自动类加载的用法总结
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET是什么
  • .Net中的设计模式——Factory Method模式
  • .NET中统一的存储过程调用方法(收藏)
  • .sh 的运行
  • @Autowired @Resource @Qualifier的区别
  • @SuppressWarnings(unchecked)代码的作用
  • [AR]Vumark(下一代条形码)
  • [C++基础]-入门知识