【LeetCode OJ】Word Ladder I
Problem Link:
http://oj.leetcode.com/problems/word-ladder/
Two typical techniques are inspected in this problem:
- Hash Table. One hash set is the words dictionary where we can check if a word is in the dictionary in O(1) time. The other hash set is used to store all visited words we already checked.
- Double-direction BFS. To accelerate the process that finds the shortest path between start word and end word, we need carry on a special BFS from both start word and end word. If there exists a path between start word and end word, then two fronts must meet at some time.
One simple solution for this problem is BFS from the start word, we keep a list of edge words (the last word of each path). Each time, we search all unvisited words next to the edge words, and add these new found words into the new edge list. The program return the length of the path when the end words is reached, or return 0 if no unvisited words can be found.
However, I implemented this BFS but got a TLE. So I adapted a double-direction BFS which may half the running time, and is accepted by the leetcode judge. The algorithm can go as follows.
Let start_front be the list of edge words of BFS paths from the start word
Let end_front be the list of edge words of BFS paths from the end word
Initialize start_front = [start] and end_front = [end]
Start a double direction BFS loop, in each iteration we extend the two fronts as follows:
For each word w in start_front
Find all transformable words of w those are not visited yet
Let all new found words be the new start_font, return 0 if no new words found
If two fronts meet, then return the number of transforms
For each word w in end_front
Find all transformable words of w those are not visited yet
Let all new found words be the new end_front, return 0 if no new words found
If two fronts meet, then return the number of transforms
The following code is the python implementatation which is accepted by leetcode.com.
class Solution:
# @param start, a string
# @param end, a string
# @param dict, a set of string
# @return an integer
def ladderLength(self, start, end, dict):
"""
Suppose start, end, and all words in dict are of the same length.
Then we apply BFS from both start and end, and keep track of the two front edges.
If the two front meet, then there is a path from start to end.
The algorithm can go as follows.
1) Let start_front be the list of words on the edge BFS from start word;
2) Let end_front be the list of words on the edge BFS from end word;
3) Initialize start_front = [start] and end_front = [end]
4) Start a loop where each iteration we do extend two fronts and check if they meet:
1a) Extend the start front to unvisited words
1b) If the start front cannot be extent, it means there is no path between start and end,
then return 0.
1c) If the two fronts meet, then return (transform_number + 1)
2a) Extend the end front to unvisited words
2b) If the end front cannot be extent, then return 0
2c) If the two front meet, then return (transform_number + 1)
"""
# Special cases
if start == end:
return 1 # The length of words
WORD_LENGTH = len(start) # Initialize the two fronts
start_front = [start]
end_front = [end] # Initialize the number of transforms
counter = 0 # Initialize the set of visited words
visited = set()
visited.add(start)
visited.add(end) # Extend the two fronts and check if they can meet
while True:
# Extend the start front
new_front = []
# Suppose the start front can extend
counter += 1
# Check all unvisited words transformed from the start front
for w in start_front: # Each word in the start front
for i in xrange(WORD_LENGTH): # Each character in the word
for candidate in [w[:i]+chr(97+c)+w[i+1:] for c in xrange(26)]:
# Check if two fronts can meet
if candidate in end_front:
return counter + 1
# Find all unvisited words from the front and add them as new front
if candidate in dict and candidate not in visited:
new_front.append(candidate)
visited.add(candidate)
# Check if there exists any word for the new front
if new_front:
start_front = new_front
else:
return 0 # Extend the end front
new_front = []
# Suppose the end front can extend
counter += 1
# Check all unvisited words transformed from the end front
for w in end_front: # Each word in the end front
for i in xrange(WORD_LENGTH): # Each character in the word
for candidate in [w[:i]+chr(97+c)+w[i+1:] for c in xrange(26)]:
# Check if two fronts can meet
if candidate in start_front:
return counter + 1
# Find all unvisited words from the front and add them as new front
if candidate in dict and candidate not in visited:
new_front.append(candidate)
visited.add(candidate)
# Check if there exists any word for the new front
if new_front:
end_front = new_front
else:
return 0
【LeetCode OJ】Word Ladder I的更多相关文章
- 【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 Break II
Problem link: http://oj.leetcode.com/problems/word-break-ii/ This problem is some extension of the w ...
- 【LeetCode OJ】Word Break
Problem link: http://oj.leetcode.com/problems/word-break/ We solve this problem using Dynamic Progra ...
- 【LeetCode OJ】Reverse Words in a String
Problem link: http://oj.leetcode.com/problems/reverse-words-in-a-string/ Given an input string, reve ...
- 【LeetCode OJ】Interleaving String
Problem Link: http://oj.leetcode.com/problems/interleaving-string/ Given s1, s2, s3, find whether s3 ...
- 【LeetCode OJ】Validate Binary Search Tree
Problem Link: https://oj.leetcode.com/problems/validate-binary-search-tree/ We inorder-traverse the ...
- 【LeetCode OJ】Recover Binary Search Tree
Problem Link: https://oj.leetcode.com/problems/recover-binary-search-tree/ We know that the inorder ...
- 【LeetCode OJ】Same Tree
Problem Link: https://oj.leetcode.com/problems/same-tree/ The following recursive version is accepte ...
- 【LeetCode OJ】Symmetric Tree
Problem Link: https://oj.leetcode.com/problems/symmetric-tree/ To solve the problem, we can traverse ...
随机推荐
- jsp基础知识(基本的语法及原理)
jsp 语法分为三种不同的类型: (1) 编译器指令: 类如: <%@ page import="java.io.*"%> (2) 脚本语法: 指定的是java代码: ...
- hdu----(5055)Bob and math problem(贪心)
Bob and math problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- hdu---(2604)Queuing(矩阵快速幂)
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- Anagrams [LeetCode]
Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be ...
- 148. Sort List -- 时间复杂度O(n log n)
Sort a linked list in O(n log n) time using constant space complexity. 归并排序 struct ListNode { int va ...
- SDWebImage源码刨根问底
前言: SDWebImage是iOS中一款处理图片的框架, 使用它提供的方法, 一句话就能让UIImageView,自动去加载并显示网络图片,将图片缓存到内存或磁盘缓存,正好有阅读开源项目的计划,于是 ...
- SQL的常用语句
select * from g_members where id between '16' and '31' order by id desc 倒序排列 select * from g_members ...
- 如何在 Linux 上用 SQL 语句来查询 Apache 日志
Linux 有一个显著的特点,在正常情况下,你可以通过日志分析系统日志来了解你的系统中发生了什么,或正在发生什么.的确,系统日志是系统管理员在解决系统和应用问题时最需要的第一手资源.我们将在这篇文章中 ...
- 二分图 最大权匹配 km算法
这个算法的本质还是不断的找增广路: KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最 ...
- jsp标签之<%%>和<%!%>
<%! %>中声明的是全局变量,不过写前面最好<% %>中声明的是局部变量.<%=%>一般表达式,输出某一变量的值.例如:<%! String totalSt ...