leetcode-332

199 阅读1分钟

题目描述:具体描述见原题,简单来说就是按照规定深度递归寻找一条可行路径。

解题思路:首先将路径使用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) 
}