题目描述:具体描述见原题,简单来说就是按照规定深度递归寻找一条可行路径。
解题思路:首先将路径使用map存储,key是起始点,value是起始点可以直接到达的所有终点。其次给value内元素按照字典序排序。最后从给定出发点深度递归,终止条件是该起始点对应map中的value为空。具体过程见代码。
具体代码:
func findItinerary(tickets [][]string) []string {
paths := make(map[string][]string)
res := make([]string, 0)
for _, t := range tickets{ // 根据题目中给定路径构造map
paths[t[0]] = append(paths[t[0]], t[1])
}
for t := range paths { // 给map中所有value按照字典序排序
sort.Strings(paths[t])
}
travel("JFK", &res, paths) // 从“JFK”开始递归
i, j := 0, len(res)-1
for i < j { // 递归完成后倒序输出res
res[i], res[j] = res[j], res[i]
i++
j--
}
print(res)
return res
}
func travel(start string, res *[]string, path map[string][]string) {
for len(path[start]) != 0 { // 当前节点可到达路径不为空时
ns := path[start][0] // 下一个节点为字典序较小的点
path[start] = path[start][1:] // 访问过的路线初始点删除,代表该条路线已经访问过
travel(ns, res, path) // 递归
}
*res = append(*res, start) // 递归终止条件
}
补充说明:最开始的travel如下,但是会有语法错误,我现在感到迷茫。
func travel(start string, res *[]string, path *map[string][]string) {
temp := *(path)[start] // 该处会有语法错误,真是头大
for len(path[start]) != 0 {
ns := path[start][0]
path[start] = path[start][1:]
travel(ns, res, path)
}
*res = append(*res, start)
}