problem: https://oj.leetcode.com/problems/word-ladder-ii/
代码:https://play.golang.org/p/qdmadQUcEC

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
}