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:

  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.

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的更多相关文章

  1. leetcode — word-ladder

    import java.util.*; /** * Source : https://oj.leetcode.com/problems/word-ladder/ * * * Given two wor ...

  2. [LeetCode] Word Ladder 词语阶梯

    Given two words (beginWord and endWord), and a dictionary, find the length of shortest transformatio ...

  3. leetcode算法分类

    利用堆栈:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/http://oj.leetcode.com/problem ...

  4. LeetCode题目分类

    利用堆栈:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/http://oj.leetcode.com/problem ...

  5. 【LeetCode OJ】Word Ladder II

    Problem Link: http://oj.leetcode.com/problems/word-ladder-ii/ Basically, this problem is same to Wor ...

  6. 【LeetCode OJ】Word Ladder I

    Problem Link: http://oj.leetcode.com/problems/word-ladder/ Two typical techniques are inspected in t ...

  7. <转>LeetCode 题目总结/分类

    原链接:http://blog.csdn.net/yangliuy/article/details/44514495 注:此分类仅供大概参考,没有精雕细琢.有不同意见欢迎评论~ 利用堆栈:http:/ ...

  8. leetcode@ [127] Word Ladder (BFS / Graph)

    https://leetcode.com/problems/word-ladder/ Given two words (beginWord and endWord), and a dictionary ...

  9. [LeetCode]题解(python):127-Word Ladder

    题目来源: https://leetcode.com/problems/word-ladder/ 题意分析: 和上一题目类似,给定一个beginWord和一个endWord,以及一个字典list.这题 ...

  10. LeetCode 题目总结/分类

    LeetCode 题目总结/分类 利用堆栈: http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/ http://oj.l ...

随机推荐

  1. hw-text1

    Text 1 测试题 python是什么类型的语言? 解释型语言,是脚本语言 百娘(脚本语言是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语 ...

  2. 通过try、except和else的使用来使Python程序更加“强壮”

    在执行的程序中,难免会碰到因为一些原因如输入输出导致致命性错误产生的情况(如因为输入的文件名错误而导致无法运行相关的代码.).此时你不希望程序直接挂掉,而是通过显示一些信息,使其平稳的结束.此时,就可 ...

  3. RBM 与 DBN 学习笔记

    2006 年,Hinton 等人基于受限波尔兹曼机(Re- stricted Boltzmann Machines, RBMs)提出的深度信念 网络(Deep Belief Networks, DBN ...

  4. C语言的指针

    指针是C语言中非常重要的数据类型,那么什么是指针呢? 指针类型就是用来用来存放变量地址的变量,指向某个变量. 指针的一般形式:*指针变量名 int *p; float *p1; “*”是用来说明这个变 ...

  5. C 字符串倒转,XCode中编译

    正在学习ios开发,在前期学习c时,常规方法直接倒转数组的值,只能用于非中文字符,否则出现乱码, 在网上找了点资料,可能是 IDE不一致,一直得不到自己想要的值.花时间自己改了一下,正常通过 //字符 ...

  6. 编程思想—面向切面编程(AOP)

    谈到面向切面的编程,我们很容易关联到面向对象编程(OOP).个人对这两种编程方式的解释为:两种编程思想只是站在编程的角度问题. OOP注重的是对象,怎么对对象行为和方法的抽象.如何封装一个具有完整属性 ...

  7. base64的一个应用情景

    AddActivity.xml rushrank.xml 不过AddActivity.xml不也是通过二进制流就传过去了吗?      事实上是可以的,只要不将这些二进制的数据写下来,传播是可以的,只 ...

  8. Android应用自杀和干掉其它进程

    // 自杀(这种方式只能杀掉自己的进程,其它进程无法杀死) int pid = Process.myPid(); android.os.Process.killProcess(pid); // 或者 ...

  9. 【NOIP 2011】 观光公交

    题目描述 Description 风景迷人的小城 Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号 ...

  10. NOR FLASH与NAND FLASH

    整理自NOR FLASH 与NAND FLASH 1:NandFlash与NorFlash典型电路图 Nor Flash接原理图 从上图可以看出,该NorFlash采用并行地址和数据总线, 其中,21 ...