Word Ladder
Medium
Given two words (beginWord _and _endWord), and a dictionary's word list, find the length of shortest transformation sequence from beginWord _to _endWord, such that:
Only one letter can be changed at a time.
Each transformed word must exist in the word list. Note that _beginWord _is _not _a transformed word.
Note:
Return 0 if there is no such transformation sequence.
All words have the same length.
All words contain only lowercase alphabetic characters.
You may assume no duplicates in the word list.
You may assume _beginWord _and _endWord _are non-empty and are not the same.
Example 1:
Input:
beginWord = "hit",
endWord = "cog",
wordList = ["hot","dot","dog","lot","log","cog"]
Output: 5
Explanation: As one shortest transformation is "hit" -> "hot" -> "dot" -> "dog" -> "cog",
return its length 5.Example 2:
Analysis
这道题很经典,巧妙之处在于转化问题:wordList中的word相当于图中的节点,是否存在边连接节点呢?就在于改变word中的一个字符时能否找到另一个节点,即图中的两个word节点之间否有边,取决于两个word之间是否只相差一个字符串。beginWord相当于起点,endWord相当于终点。Word Ladder的问题本质其实就是寻找起点到终点的最短路径。这样,用BFS就可以解决。
改变字符串中的字符的两种方法:
StringBuilder()
toCharArray()
The intuition:
BFS -- Altering one character at a time for beginWord, and see if it's in the wordList, if yes, then add to the toSearch list; for the word in toSearch list, do the same: altering one character at a time, see if it's in wordList, so on and so forth.
Note: to avoid cyclical search, we need to remove the "searched" word from the wordList
Optimization: using two end BFS
Solution
BFS (using set)- (133ms 43.15%)
A more "traditional" BFS using Queue (63 ms, faster than 78.37%)
Two-End BFS (15 ms, faster than 99.01%)
Reference
Last updated
Was this helpful?