| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | package mainfunc findLadders(beginWord string, endWord string, wordList []string) (ladders [][]string) {	endIdx, listLen := -1, len(wordList)	for i := 0; i < listLen; i++ {		if endWord == wordList[i] {			endIdx = i			break		}	}	if endIdx == -1 {		return	} // Find end word in word list, if not found, return false	adj := make([][]int, listLen)	for i := 0; i < listLen; i++ {		for j := i + 1; j < listLen; j++ {			if isConvertible(wordList[i], wordList[j]) {				adj[i] = append(adj[i], j) // Dont need to init each row of adj if use append				adj[j] = append(adj[j], i)			}		}	} // Create adj matrix	visited := make([]bool, listLen)	closest := make([]int, 0)	distance := make([]int, listLen) // Distance from begin to word i	prev := make([][]int, listLen)   // List of prev point	for i := 0; i < listLen; i++ {		prev[i] = make([]int, 0)		if isConvertible(beginWord, wordList[i]) {			prev[i] = append(prev[i], -1) // -1 means begin word			closest = append(closest, i)			distance[i] = 1			visited[i] = true		}	} // Init closest array	for distance[endIdx] == 0 && len(closest) != 0 {		newClosest := make([]int, 0)		for _, c := range closest {			for _, i := range adj[c] {				if !visited[i] {					if distance[i] == 0 {						distance[i] = distance[c] + 1						newClosest = append(newClosest, i)					}					prev[i] = append(prev[i], c)				}			}		}		for i := range newClosest {			visited[newClosest[i]] = true		}		closest = newClosest	}	var getLadders func(int, []string) // Get ladders from prev path	getLadders = func(idx int, ladder []string) {		var newLadder []string		if idx == -1 {			newLadder = []string{beginWord}			newLadder = append(newLadder, ladder...)			ladders = append(ladders, newLadder)			return		}		newLadder = []string{wordList[idx]}		newLadder = append(newLadder, ladder...)		for i := range prev[idx] {			getLadders(prev[idx][i], newLadder)		}	}	getLadders(endIdx, []string{})	return}func isConvertible(a, b string) bool {	diff := 0	for i := range a {		if a[i] != b[i] {			diff++		}		if diff > 1 {			return false		}	}	return diff == 1}// func main() {// 	fmt.Println(findLadders(// 		"hit",// 		"cog",// 		[]string{"hot", "dot", "dog", "lot", "log", "cog"}))// 	fmt.Println(findLadders(// 		"hit",// 		"cog",// 		[]string{"hot", "dot", "dog", "lot", "log"}))// 	fmt.Println(findLadders(// 		"hot",// 		"dog",// 		[]string{"hot", "dog", "dot"}))// }
 |