LeetCode
  • Introduction
  • Design
    • 348. Design Tic-Tac-Toe
    • 534. Design TinyURL
    • 535. Encode and Decode TinyURL
    • 346. Moving Average from Data Stream
    • 281. Zigzag Iterator
    • 381. Insert Delete GetRandom O(1) - Duplicates allowed
    • 432. All O`one Data Structure
    • 341. Flatten Nested List Iterator
    • 642. Design Search Autocomplete System
    • 170. Two Sum III - Data structure design
    • 622. Design Circular Queue
    • 295. Find Median from Data Stream
  • OOD
    • 146.LRU Cache(Amazon)
  • Sort
    • Bucket Sort
      • 791. Custom Sort String
      • 347. Top K Frequent Elements
      • 1057. Campus bikes
    • 280. Wiggle Sort
    • 75. Sort Colors
  • Binary Search
    • 278. First Bad Version
    • 162. Find Peak Element in O(logn)
    • LintCode 183. Wood Cut
    • 33. Search in Rotated Sorted Array
    • 81. Search in Rotated Sorted Array II
    • 153. Find Minimum in Rotated Sorted Array
    • 154. Find Minimum in Rotated Sorted Array II
    • 34. Find First and Last Position of Element in Sorted Array
    • Count number of occurrences (or frequency) in a sorted array
    • 378. Kth Smallest Element in a Sorted Matrix
    • 240. Search a 2D Matrix II
    • 658. Find K Closest Elements
    • 410. Split Array Largest Sum
  • Data Structure
    • Arrays
      • Two Pointer
        • 11. Container With Most Water
      • 283. Move Zeros
      • 26. Remove Duplicates from Sorted Array
      • 88. Merge Sorted Array
      • 683. K Empty Slots
      • 4. Median of Two Sorted Arrays
      • Interval
        • 56. Merge Interval
        • 57. Insert Interval
      • 54. Spiral Matrix
      • 48. Rotate Image(Amazon, MicroSoft, Apple)
      • 448. Find All Numbers Disappeared in an Array
      • 228. Summary Ranges
      • 289. Game of Life
      • 298. Product of Array Except Self
      • 825. Friends of Appropriate Ages
    • Stack
      • Postfix to Infix
      • 155. Min Stack
      • 716. Max Stack
      • 388. Longest Absolute File Path
      • 316. Remove Duplicate Letters
      • 636. Exclusive Time of Functions
      • Calculator Series
        • 227. Basic Calculator
        • 772. Basic Calculator III
    • Trie
      • 208. Implement Trie (Prefix Tree)
      • 211. Add and Search Word - Data structure design
      • 336. Palindrome Pairs
      • 212. Word Search II
    • Heap
      • 218. The Skyline Problem
      • 23. Merge k Sorted Lists
      • 252. Meeting Rooms
      • 253. Meeting Rooms II
      • 215. Kth Largest Element in an Array
      • 692. Top K Frequent Words
      • 373. Find K Pairs with Smallest Sums
    • Deque
      • 239. Sliding Window Maximum
    • Map
      • 128. Longest Consecutive Sequence
      • 350. Intersection of Two Arrays II
      • 760. Find Anagram Mappings
    • Segment Tree / Binary Indexed Tree
      • 308. Range Sum Query 2D - Mutable
      • 218. The Skyline Problem
      • 315. Count of Smaller Numbers After Self
      • 308. Range Sum Query 2D - Mutable
      • 493. Reverse Pairs
    • Linked List
      • 19. Remove Nth Node From End of List
      • 24. Swap Nodes in Pairs
      • 160. Intersection of Two Linked Lists
      • 138. Copy List with Random Pointer
      • 143. Reorder List
      • 445. Add Two Numbers II
    • Tree
      • BST
        • 109. Convert Sorted List to Binary Search Tree
        • 285. Inorder Successor in BST
        • Convert Binary Search Tree (BST) to Sorted Doubly-Linked List
        • Construct Binary Tree from Inorder and Postorder Traversal
      • 101. Symmetric Tree
      • 105. Construct Binary Tree from Preorder and Inorder Traversal
      • 106. Construct Binary Tree from Inorder and Postorder Traversal
      • 110. Balanced Binary Tree
      • 129. Sum Root to Leaf Numbers
      • 199. Binary Tree Right Side View
      • 257. Binary Tree Paths
      • 543. Diameter of Binary Tree
      • Sum Root to Leaf Numbers
    • Hash Table
      • 325. Maximum Size Subarray Sum Equals k
      • 314. Binary Tree Vertical Order Traversal
    • Union-Find
      • 721. Accounts Merge
      • 305. Number of Islands II
      • 323. Number of Connected Components in an Undirected Graph
      • 261. Graph Valid Tree
      • 947. Most Stones Removed with Same Row or Column
    • Linked List
      • 138. Copy List with Random Pointer
      • 21. Merge Two Sorted Lists
      • 23. Merge K Sorted Lists
      • 206. Reverse Linked List
      • 237. Delete Node in a Linked List
      • 141. Linked List Cycle
      • 142. Linked List Cycle II
      • 148. Sort List
      • 708. Insert into a Cyclic Sorted List
  • Graph
    • BFS/DFS
      • Topological Sort
        • 207. Course Schedule
        • 210. Course Schedule II
        • 133. Clone Graph
        • 675. Cut Off Trees for Golf Event
        • 269. Alien Dictionary
      • BackTracking
        • 39. Combination Sum
        • 40. Combination Sum II
        • 79. Word Search
        • 212. Word Search II
        • 282. Expression Add Operators
      • Memoization
        • 329. Longest Increasing Path in a Matrix
      • 733. Flood Fill
      • 279. Perfect Squares
      • 200. Number of Islands (Amazon)
      • 694. Number of Distinct Islands
      • 711. Number of Distinct Islands II
      • 98. Validate Binary Search Tree
      • 785. Is Graph Bipartite?
      • 491. Increasing Subsequences
      • 51. N-Queens
      • 52. N-Queens II
      • 286. Walls and Gates
      • 111. Minimum Depth of Binary Tree
      • 753. Craking the Safe
    • 399. Evaluate Division
    • 127. Word Ladder
    • 126. Word Ladder II
    • 339. Nested List Weight Sum
  • Traversal
    • 297. Serialize and Deserialize Binary Tree
    • 236. Lowest Common Ancestor of a Binary Tree
    • 235. Lowest Common Ancestor of a Binary Search Tree
    • 144. Binary Tree Preorder Traversal
    • 255. Verify Preorder Sequence in Binary Search Tree
    • 94. Binary Tree Inorder Traversal
    • 145. Binary Tree Post Order Traversal
    • 102. Level Order Traversal
    • 103. Binary Tree Zipzag Level Order Traversal
    • 107. Binary Tree Level Order Traversal
    • 156. Binary Upside Down
    • 173. Binary Search Tree Iterator
    • 99. Recover Binary Search Tree
    • Morris Traversal
    • 498. Diagonal Traverse
    • Flatten
      • Flatten Binary Tree to Linked List
  • Math
    • Bit Manipulation
      • 231. Power of Two
      • 393. UTF-8 Validation
      • 371. Sum of Two Integers
    • 463. Island Perimeter
    • 50. Pow(x,n)
    • 326. Power of Three
    • 67. Add Binary
    • 29. Divide Two Integers
    • 360. Sort Transformed Array
    • 247. Strobogrammatic Number II
    • 277. Find the Celebrity
    • 246. Strobogrammatic Number
    • 415. Add Strings
    • 398. Reservoir Sampling
    • 43. Multiply Strings
    • 311. Sparse Matrix Multiplication
    • 8. String to Integer (Atoi)
    • 7. Reverse Integer
    • 829. Consecutive Numbers Sum
    • MiniMax
      • Guess the Word
  • Sum
    • 1. Two Sum
    • 167. Two Sum II - Input array is sorted
    • 15. 3Sum
    • 16. 3Sum Closest
    • 18. 4Sum
    • 454. 4Sum II
    • Path sum
      • 124. Binary Tree Maximum Path Sum
      • 113. Path Sum II
      • 437. Path Sum III
    • 209. Minimum Size Subarray Sum
    • 862. Shortest Subarray with Sum at Least K
    • 560. Subarray Sum Equals K
    • 523. Continuous Subarray Sum
  • Parentheses
    • 20. Valid Parentheses
    • 32. Longest Valid Parentheses
    • 301. Remvoe Invalid Parenthesis
    • 678. Valid Parenthesis String
  • String
    • Substring Search
      • 3. Longest Substring Without Repeating Characters
      • 438. Find All Anagrams in a String
      • 76. Minimum Window Substring
      • 30. Substring with Concatenation of All Words
      • 159. Longest Substring with At Most Two Distinct Characters
      • 340. Longest Substring with At Most K Distinct Characters
      • 395. Longest Substring with At Least K Repeating Characters
    • 12. Integer to Roman
    • 13. Roman to Integer
    • 44. Wildcard Matching
    • 242. Valid Anagram
    • 49. Group Anagrams
    • 657. Judge Route Circle
    • 482. License Key Formatting
    • 681. Next Closet Time
    • 387. First Unique Character in a String
    • 426. Convert Binary Search Tree to Sorted Doubly Linked List
    • 273. Integer to English Words
    • 157. Read N Characters Given Read4
    • 158. Read N Characters Given Read4 II - Call multiple times
    • 480. Valid Word Abbreviation
    • 409. Longest Palindrome
    • 680. Valid Palindrome II
    • 125. Valid Palindrome
    • 468. Validate IP Address
    • 161. One Edit Distance
    • 38. Count and Say
    • 1096. Brace Expansion II
  • Greedy
    • 630. Course Schedule III
    • 621. Task Scheduler
    • 358. Rearrange String k Distance Apart
    • 406. Queue Reconstruction by Height
    • 316. Remove Duplicate Letters
    • 767. Reorganize String
  • Dynamic Programming
    • Palindromic Substring
      • 5. longest Palindromic Substring
    • Subarray
      • 53. Maximum Subarray
      • 152. Maximum Product Subarray
    • Backpack problem
      • Backpack I
      • Backpack II
      • Backpack III
      • Backpack IV
      • Backpack V
      • Backpack VI aka: Combination Sum IV
      • Coin Change 2
    • 70. Climbing Stairs
    • 10. Regular Expression Matching
    • 91. Decode Ways
    • 338. Counting Bits
    • 121. Best Time to Buy and Sell Stock
    • 122. Best Time to Buy and Sell Stock II
    • 123. Best Time to Buy and Sell Stock III
    • 139. Word Break
    • 140. Word Break II
    • 198. House Robber
    • 72. Edit Distance
    • 221. Maximal Square
    • 84. Largest Rectangle in Histogram
    • 312. Burst Balloons
    • 304. Range Sum Query 2D - Immutable
    • 518. Coin Change 2
    • Longest Arithmetic Progression
    • 975. Odd Even Jump
    • 1066. Campus Bikes II
  • JingChi.ai
    • Word Composition
    • Sliding Window Median
    • 537. Erect the Fence (Convex Hull Problem)
    • LintCode 558: Sliding Window Matrix Maximum
    • orienteering game
    • 扫雷
  • Twitter
    • Identifying Triangle
    • Last and Second-Last
    • 300. Longest increasing subsequence
    • Twin String
    • 647. Number of palindromic substring
    • Wildcard Matching
  • Akuna
    • C++ Intern
    • V1
    • V2
    • Cut the Sticks
    • Quant Dev
    • Postfix_to_infix
    • Drone Delivery
    • phone
  • LintCode Contest
    • Ask For Cooling Time
  • SQL
    • 176. Second Highest Salary
    • 597. Friend Requests I: Overall Acceptance Rate
  • FB 19
    • Convert Binary Search Tree (BST) to Sorted Doubly-Linked List
    • 3Sum
    • Minimum Window Substring
    • Count number of occurrences (or frequency) in a sorted array
    • Count NO2
    • Valid Palindrome
    • Merge k Sorted Lists
    • Kth Largest Element in an Array
    • Move Zeros
    • Remove Invalid Parenthesis
    • friends
    • Integer to English
    • Islands
    • Valid Palindrome
    • sec
      • Longest Increasing Path in a Matrix
      • Product of Array Except Self
      • Binary Tree Vertical Order Traversal
      • Add Binary
      • Valid Parentheses
      • sup
        • 128. Longest Consecutive Sequence
        • Combination Sum II
        • Add and Search Word - Data structure design
        • feb
  • Google 20
    • 410. Split Array Largest Sum
  • 818. Race Card
Powered by GitBook
On this page

Was this helpful?

  1. Graph

127. Word Ladder

Given two words (beginWord_and_endWord), and a dictionary's word list, find the length of shortest transformation sequence frombeginWord_to_endWord, such that:

  1. Only one letter can be changed at a time.

  2. 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:

Input:

beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log"]

Output: 0

Explanation: The endWord "cog" is not in wordList, therefore no possible transformation.

Thoughts:

  1. BFS: Generate the qualified permutation, add distance by 1, until find the answer or queue is empty

  2. Optimizations:

        1. Character flopping: flop (expanding the transformation candidate in the "front" set, then check whether it is in the word dictionary: T: O(M*26*L*L); O(L) . M: Dictionary Size, L: word length,

        1. Dictionary Checking: Checking whether a word in current wordDictionary can be transformed into current word in the set: T:O(MNL). N: number of words in the dictionary.

      1. Removing entries in S from T vs Creating new entries from S if it is not in T.

Code

class Solution(object):
    def ladderLength(self, beginWord, endWord, wordList):
        """
        :type beginWord: str
        :type endWord: str
        :type wordList: List[str]
        :rtype: int
        """
        def generateNeighbors(word, wordList):
            for i in range(len(word)):
                for letter in string.ascii_lowercase:
                    candidate = word[:i] + letter + word[i+1:]
                    if candidate in wordList:
                        yield candidate
        # We use q to keep track of the next nodes to process in the BFS.
        # Each item in the queue is a list with two items:
        #   item[0] = word
        #   item[1] = steps to reach word + 1 (i.e. number of nodes in list of nodes 
        #             traversed to reach word - (format of Word Ladder I output)).
        q = collections.deque([ [beginWord,1] ])
        # We keep track of words we've processed to avoid getting stuck in a loop.
        seen = set([beginWord])
        # wordList is given as a list but we want O(1) lookup so we convert to a set.
        wordList = set(wordList)
        while q:
            q_item = q.popleft()
            for candidate in generateNeighbors(q_item[0], wordList):
                if candidate == endWord:
                    return q_item[1] + 1
                elif candidate in seen:
                    continue
                seen.add(candidate)
                q.append([candidate, q_item[1] + 1])
        return 0
class Solution(object):
    def ladderLength(self, beginWord, endWord, wordList):
        """
        :type beginWord: str
        :type endWord: str
        :type wordList: List[str]
        :rtype: int
        """
        dist = 2
        n = len(beginWord)
        wordDict = set(wordList)
        wordDict.discard(beginWord)

        # corner case: since we assume endWord is in wordDict when doing the swapping
        if endWord not in wordDict:
            return 0

        front, back = set([beginWord]), set([endWord])

        while front:
            # generate all valid permutations
            front = wordDict & set([word[:i] + c + word[i+1:]
                                    for word in front 
                                    for i in range(len(word))
                                    for c in string.ascii_lowercase
                                   ])

            if front & back:
                # there are common elements in front and back, done
                return dist

            dist += 1

            if len(front) > len(back):
                # swap front and back for better performance (fewer choices in generating nextSet)
                front, back = back, front 

            # remove transformations from wordDict to avoid cycle
            wordDict -= front


        return 0

Code: Python Optimization

class Solution:
    # @param {string} beginWord
    # @param {string} endWord
    # @param {set<string>} wordDict
    # @return {integer}
    def ladderLength(self, beginWord, endWord, wordDict):
        def generateNextSet1(current, wordDict, wordLen):
            nextSet = set()
            for word in current:
                for index in range(wordLen):
                    for ch in 'abcdefghijklmnopqrstuvwxyz':
                        nextWord = word[:index] + ch + word[index+1:]
                        if nextWord in wordDict:
                            nextSet.add(nextWord)
            return nextSet

        def generateNextSet2(current, wordDict):
            nextSet = set()
            for word in current:
                for nextWord in wordDict:
                    index = 0
                    try:
                        while word[index] == nextWord[index]:
                            index += 1
                        if word[index+1:] == nextWord[index+1:]:
                            nextSet.add(nextWord)
                    except:
                        continue
            return nextSet

        steps, wordLen = 2, len(beginWord)
        front, back = set([beginWord]), set([endWord])
        wordDict.discard(beginWord)
        switchThreshold = 26*wordLen
        while front:
            # get all valid transformations
            if len(wordDict) >= switchThreshold:
                front = generateNextSet1(front, wordDict, wordLen)
            else:
                front = generateNextSet2(front, wordDict)
            if front & back:
                # there are common elements in front and back, done
                return steps
            steps += 1
            if len(front) >= len(back):
                # swap front and back for better performance (smaller nextSet)
                front, back = back, front
            # remove transformations from wordDict to avoid cycles
            if (len(wordDict)>>1) >= len(front):
                # s.difference_update(t): O(len(t))
                wordDict -= front
            else:
                # s.difference(t): O(len(s))
                wordDict = wordDict - front
        return 0
class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        unordered_set<string> wordDict (wordList.begin(), wordList.end());

        if (wordDict.find(endWord) == wordDict.end()) return 0;

        unordered_set<string> head, tail, *phead, *ptail;
        head.insert(beginWord);
        tail.insert(endWord);
        int dist = 2;
        while (!head.empty() && !tail.empty()) {
            if (head.size() <= tail.size()) {
                phead = &head;
                ptail = &tail;
            }
        else {
                phead = &tail;
                ptail = &head;
            }
        unordered_set<string> temp;
        for (auto itr = phead -> begin(); itr != phead -> end(); itr++) {
            string word = *itr;
            for (int p = 0; p < (int)word.length(); p++) {
                char letter = word[p];
                for (int k = 0; k < 26; k++) {
                    word[p] = 'a' + k;
                    if (ptail -> find(word) != ptail -> end())
                        return dist;
                    if (wordDict.find(word) != wordDict.end()) {
                        temp.insert(word);
                        wordDict.erase(word);
                        }
                    }
                word[p] = letter;
                }
            }

        dist++; 
        // throw away the expaned and add in new candidate into set
        *phead = temp;
        }

        return 0;
    }
};
Previous399. Evaluate DivisionNext126. Word Ladder II

Last updated 5 years ago

Was this helpful?

:

Code: C++ The above code can still be speeded up if we also begin fromend. Once we meet the same word fromstartandend, we know we are done. provides a nice two-end search solution. I rewrite the code below for better readability. Note that the use of two pointerspheadandptailsave a lot of time. At each round of BFS, depending on the relative size ofheadandtail, we pointpheadto the smaller set to reduce the running time.

Python
C++
Optimization
This link