leetcode-WordLadder
Word Ladder
Total Accepted: 10243 Total
Submissions: 58160My Submissions
Given two words (start and end), and a dictionary, find the length of shortest transformation sequence from start to end, such
that:
- Only one letter can be changed at a time
- 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.
Have you been asked this question in an interview?
Yes
此题是图的遍历问题。要找一条起始点到目标点最短的路径,假设存在这种路径则返回路径长度。否则返回0。 刚開始想到用深度优先搜索遍历,可是时间复杂度太大。于是转为用宽搜,把起始点放入队列中,队列中的节点是一个字符串。由于要找到最短路径,所以在取出队首节点时要知道该节点属于第几层被搜索的节点,即路径长度,我用了levels来保存当前遍历的是第几层的节点,然后扩展该节点,把编辑距离为1而且在字典中出现的字符串增加队尾。并从字典中删除该字符串。
在找编辑距离为1的字符串时,我试了两种方法,一种是遍历字典,找到编辑记录为1的字符串,假设字典数目非常大的话,每次都遍历字典耗时太多了。结果就是TLE,后来直接对节点字符串进行改动一个字符来得到扩展字符串才通过。
<span style="font-size:14px;">class Solution {
public:
typedef queue<string,deque<string>> qq;
int ladderLength(string start, string end, unordered_set<string> &dict) {
//Use queue to implement bfs operation
qq q;
q.push(start);
dict.erase(start);
int currLevelLens = 1, nextLevelLens;
int levels = 1; //To be returned answer, the total bfs levels be traversed
string front, str;
while (!q.empty()) {
nextLevelLens = 0;
while (currLevelLens--) { // Traverse the node of current level
string front = q.front();
q.pop();
if (front == end)
return levels;
for (int i=0; i<front.size(); ++i) {
for (char j='a'; j<='z'; ++j) { // transform
if (front[i]=='j')
continue;
str = front;
str[i] = j;
if (dict.find(str) != dict.end()) {
++nextLevelLens;
q.push(str);
dict.erase(str);
}
}
}
}
currLevelLens = nextLevelLens;
++levels;
}
return 0;
}
};
</span>
可是这个方案改变了dict的内容。有没有不改变dict的方法呢?我试了用一个unorder_set来保存被搜索过的字符串,可是耗时比前一种方法多。
class Solution {
public:
typedef queue<string,deque<string>> qq;
int ladderLength(string start, string end, unordered_set<string> &dict) {
//Use queue to implement bfs operation
qq q;
q.push(start);
int currLevelLens = 1, nextLevelLens;
int levels = 1; //To be returned answer, the total bfs levels be traversed
string front, str;
searchedStrs.insert(start);
while (!q.empty()) {
nextLevelLens = 0;
while (currLevelLens--) { // Traverse the node of current level
string front = q.front();
q.pop();
if (front == end)
return levels;
for (int i=0; i<front.size(); ++i) {
for (char j='a'; j<='z'; ++j) { // transform
if (front[i]==j)
continue;
str = front;
str[i] = j;
if (searchedStrs.find(str) == searchedStrs.end() && dict.find(str) != dict.end()) {
++nextLevelLens;
q.push(str);
//dict.erase(str);
searchedStrs.insert(str);
}
}
}
}
currLevelLens = nextLevelLens;
++levels;
}
return 0;
}
private:
unordered_set<string> searchedStrs;
};
Python解法:
有參考Google Norvig的拼写纠正样例:http://norvig.com/spell-correct.html
class Solution:
# @param word, a string
# @return a list of transformed words
def edit(self, word):
alphabet = string.ascii_lowercase
splits = [(word[:i],word[i:]) for i in range(len(word)+1)]
replaces = [a+c+b[1:] for a,b in splits for c in alphabet if b]
replaces.remove(word)
return replaces # @param start, a string
# @param end, a string
# @param dict, a set of string
# @return an integer
def ladderLength(self, start, end, dict):
currQueue = []
currQueue.append(start)
dict.remove(start)
ret = 0
while 1:
ret += 1
nextQueue = []
while len(currQueue):
s = currQueue.pop(0)
if s == end:
return ret
editWords = self.edit(s) for word in editWords:
if word in dict:
dict.remove(word)
nextQueue.append(word)
if len(nextQueue)==0:
return 0
currQueue = nextQueue
return 0
leetcode-WordLadder的更多相关文章
- leetcode — word-ladder
import java.util.*; /** * Source : https://oj.leetcode.com/problems/word-ladder/ * * * Given two wor ...
- [LeetCode] Word Ladder 词语阶梯
Given two words (beginWord and endWord), and a dictionary, find the length of shortest transformatio ...
- leetcode算法分类
利用堆栈:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/http://oj.leetcode.com/problem ...
- LeetCode题目分类
利用堆栈:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/http://oj.leetcode.com/problem ...
- 【LeetCode OJ】Word Ladder II
Problem Link: http://oj.leetcode.com/problems/word-ladder-ii/ Basically, this problem is same to Wor ...
- 【LeetCode OJ】Word Ladder I
Problem Link: http://oj.leetcode.com/problems/word-ladder/ Two typical techniques are inspected in t ...
- <转>LeetCode 题目总结/分类
原链接:http://blog.csdn.net/yangliuy/article/details/44514495 注:此分类仅供大概参考,没有精雕细琢.有不同意见欢迎评论~ 利用堆栈:http:/ ...
- leetcode@ [127] Word Ladder (BFS / Graph)
https://leetcode.com/problems/word-ladder/ Given two words (beginWord and endWord), and a dictionary ...
- [LeetCode]题解(python):127-Word Ladder
题目来源: https://leetcode.com/problems/word-ladder/ 题意分析: 和上一题目类似,给定一个beginWord和一个endWord,以及一个字典list.这题 ...
- LeetCode 题目总结/分类
LeetCode 题目总结/分类 利用堆栈: http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/ http://oj.l ...
随机推荐
- hw-text1
Text 1 测试题 python是什么类型的语言? 解释型语言,是脚本语言 百娘(脚本语言是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语 ...
- 通过try、except和else的使用来使Python程序更加“强壮”
在执行的程序中,难免会碰到因为一些原因如输入输出导致致命性错误产生的情况(如因为输入的文件名错误而导致无法运行相关的代码.).此时你不希望程序直接挂掉,而是通过显示一些信息,使其平稳的结束.此时,就可 ...
- RBM 与 DBN 学习笔记
2006 年,Hinton 等人基于受限波尔兹曼机(Re- stricted Boltzmann Machines, RBMs)提出的深度信念 网络(Deep Belief Networks, DBN ...
- C语言的指针
指针是C语言中非常重要的数据类型,那么什么是指针呢? 指针类型就是用来用来存放变量地址的变量,指向某个变量. 指针的一般形式:*指针变量名 int *p; float *p1; “*”是用来说明这个变 ...
- C 字符串倒转,XCode中编译
正在学习ios开发,在前期学习c时,常规方法直接倒转数组的值,只能用于非中文字符,否则出现乱码, 在网上找了点资料,可能是 IDE不一致,一直得不到自己想要的值.花时间自己改了一下,正常通过 //字符 ...
- 编程思想—面向切面编程(AOP)
谈到面向切面的编程,我们很容易关联到面向对象编程(OOP).个人对这两种编程方式的解释为:两种编程思想只是站在编程的角度问题. OOP注重的是对象,怎么对对象行为和方法的抽象.如何封装一个具有完整属性 ...
- base64的一个应用情景
AddActivity.xml rushrank.xml 不过AddActivity.xml不也是通过二进制流就传过去了吗? 事实上是可以的,只要不将这些二进制的数据写下来,传播是可以的,只 ...
- Android应用自杀和干掉其它进程
// 自杀(这种方式只能杀掉自己的进程,其它进程无法杀死) int pid = Process.myPid(); android.os.Process.killProcess(pid); // 或者 ...
- 【NOIP 2011】 观光公交
题目描述 Description 风景迷人的小城 Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号 ...
- NOR FLASH与NAND FLASH
整理自NOR FLASH 与NAND FLASH 1:NandFlash与NorFlash典型电路图 Nor Flash接原理图 从上图可以看出,该NorFlash采用并行地址和数据总线, 其中,21 ...