332.reconstruct-itinerary.go 981 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. type StringSlice []string
  2. func (ss StringSlice) Len() int { return len(ss) }
  3. func (ss StringSlice) Less(i, j int) bool { return ss[i] < ss[j] }
  4. func (ss StringSlice) Swap(i, j int) { ss[i], ss[j] = ss[j], ss[i] }
  5. func (ss *StringSlice) Push(x interface{}) {
  6. *ss = append(*ss, x.(string))
  7. }
  8. func (ss *StringSlice) Pop() interface{} {
  9. old := *ss
  10. n := len(old)
  11. x := old[n-1]
  12. *ss = old[0 : n-1]
  13. return x
  14. }
  15. func findItinerary(tickets [][]string) (res []string) {
  16. m := make(map[string]StringSlice)
  17. for i := 0; i < len(tickets); i++ {
  18. ss := m[tickets[i][0]]
  19. heap.Push(&ss, tickets[i][1])
  20. m[tickets[i][0]] = ss
  21. }
  22. dfs(&m, "JFK", &res)
  23. for l, r := 0, len(tickets); l < r; l, r = l+1, r-1 {
  24. res[l], res[r] = res[r], res[l]
  25. }
  26. return res
  27. }
  28. func dfs(m *map[string]StringSlice, dst string, res *[]string) {
  29. for (*m)[dst].Len() != 0 {
  30. ss := (*m)[dst]
  31. next := heap.Pop(&ss).(string)
  32. (*m)[dst] = ss
  33. dfs(m, next, res)
  34. }
  35. *res = append(*res, dst)
  36. }