| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 | package main// begin & end are non-empty and not the samefunc ladderLength(beginWord string, endWord string, wordList []string) int {	wordCnt := len(wordList)	if wordCnt == 0 {		return 0	}	target := -1	for i := 0; i < wordCnt; i++ {		if wordList[i] == endWord {			target = i			break		}	}	if target == -1 {		return 0	}	newList := append(wordList, beginWord)	distance := make([]int, wordCnt+1)	distance[wordCnt] = 1 // Initial ladder length: 1	isMin := make([]bool, wordCnt+1)	queue := make([]int, 0)	queue = append(queue, wordCnt)	for len(queue) != 0 { // Dijkstra method		newQueue := make([]int, 0)		for len(queue) != 0 {			idx := queue[0]			queue = queue[1:] // Dequeue			for i := 0; i < wordCnt; i++ {				if !isMin[i] {					if isConvertible(newList[idx], newList[i]) &&						(distance[i] == 0 || distance[idx] < distance[i]) {						distance[i] = distance[idx] + 1					}					if len(queue) == 0 && distance[i] != 0 {						newQueue = append(newQueue, i)						isMin[i] = true					}				}			}		}		queue = newQueue	}	return distance[target]}func isConvertible(src, dst string) bool {	diff := 0	for i := 0; i < len(src); i++ {		if src[i] != dst[i] {			diff++		}	}	return diff == 1}// func main() {// 	wordList := []string{"hot", "dot", "dog", "lot", "log", "cog"}// 	println(ladderLength("dog", "but", wordList))// 	println(ladderLength("hit", "cog", wordList))// }
 |