LeetCode-in-Go

127. Word Ladder

Hard

A transformation sequence from word beginWord to word endWord using a dictionary wordList is a sequence of words beginWord -> s1 -> s2 -> ... -> sk such that:

Given two words, beginWord and endWord, and a dictionary wordList, return the number of words in the shortest transformation sequence from beginWord to endWord, or 0 if no such sequence exists.

Example 1:

Input: beginWord = “hit”, endWord = “cog”, wordList = [“hot”,”dot”,”dog”,”lot”,”log”,”cog”]

Output: 5

Explanation: One shortest transformation sequence is “hit” -> “hot” -> “dot” -> “dog” -> cog”, which is 5 words long.

Example 2:

Input: beginWord = “hit”, endWord = “cog”, wordList = [“hot”,”dot”,”dog”,”lot”,”log”]

Output: 0

Explanation: The endWord “cog” is not in wordList, therefore there is no valid transformation sequence.

Constraints:

Solution

func ladderLength(beginWord string, endWord string, wordList []string) int {
	wordSet := make(map[string]bool)
	for _, word := range wordList {
		wordSet[word] = true
	}
	if !wordSet[endWord] {
		return 0
	}
	beginSet := make(map[string]bool)
	endSet := make(map[string]bool)
	visited := make(map[string]bool)
	beginSet[beginWord] = true
	endSet[endWord] = true
	lenght := 1
	strLen := len(beginWord)
	for len(beginSet) > 0 && len(endSet) > 0 {
		if len(beginSet) > len(endSet) {
			beginSet, endSet = endSet, beginSet
		}
		tempSet := make(map[string]bool)
		for s := range beginSet {
			chars := []byte(s)
			for i := 0; i < strLen; i++ {
				old := chars[i]
				for j := byte('a'); j <= 'z'; j++ {
					chars[i] = j
					temp := string(chars)
					if endSet[temp] {
						return lenght + 1
					}
					if !visited[temp] && wordSet[temp] {
						tempSet[temp] = true
						visited[temp] = true
					}
				}
				chars[i] = old
			}
		}
		beginSet = tempSet
		lenght++
	}
	return 0
}