problem: https://oj.leetcode.com/problems/word-ladder-ii/
代码:https://play.golang.org/p/qdmadQUcECgolang
package main import ( "fmt" ) func main() { start := "hit" end := "cog" dict := []string{"hot", "dot", "dog", "lot", "log"} dict = append(dict, start, end) mapAdjacency := createAdjacencyGraph(dict, start, end) findLadders(mapAdjacency, start, end) } func findLadders(mapAdjacency map[string][]string, start, end string) { visited := make(map[string]int, len(mapAdjacency)) visited[start] = 1 queue := make([]string, len(mapAdjacency)) queue = append(queue, start) mapParent := make(map[string][]string, len(mapAdjacency)) bfs(mapAdjacency, visited, queue, mapParent, start, end) stack := []string{} stack = append(stack, end) printShortestPath(mapParent, stack, start, end) } func printShortestPath(mapParent map[string][]string, stack []string, start, end string) { if end == start { printStack(stack) return } for _, v := range mapParent[end] { stack = append(stack, v) printShortestPath(mapParent, stack, start, v) stack = stack[:len(stack)-1] } } func printStack(stack []string) { lenStack := len(stack) for i := lenStack - 1; i >= 0; i-- { fmt.Printf("%s ", stack[i]) } fmt.Println() } func bfs(mapAdjacency map[string][]string, visited map[string]int, queue []string, mapParent map[string][]string, start string, end string) { var cur string for len(queue) > 0 { //出队列 cur, queue = queue[0], queue[1:] for _, value := range mapAdjacency[cur] { if visited[value] == 0 { //入队列 queue = append(queue, value) visited[value] = visited[cur] + 1 mapParent[value] = append(mapParent[value], cur) } else if visited[value] > visited[cur] { mapParent[value] = append(mapParent[value], cur) } } } } func createAdjacencyGraph(dict []string, start, end string) (mapAdjacency map[string][]string) { mapAdjacency = make(map[string][]string) lenWord := len(start) for _, vi := range dict { for _, vj := range dict { count := 0 if vi != vj { for k := 0; k < lenWord; k++ { if vi[k] == vj[k] { count++ } } if count == lenWord-1 { //find adjacency mapAdjacency[vi] = append(mapAdjacency[vi], vj) } } } } return }