| 123456789101112131415161718192021222324252627282930313233343536373839404142 | 
							- type StringSlice []string
 
- func (ss StringSlice) Len() int           { return len(ss) }
 
- func (ss StringSlice) Less(i, j int) bool { return ss[i] < ss[j] }
 
- func (ss StringSlice) Swap(i, j int)      { ss[i], ss[j] = ss[j], ss[i] }
 
- func (ss *StringSlice) Push(x interface{}) {
 
- 	*ss = append(*ss, x.(string))
 
- }
 
- func (ss *StringSlice) Pop() interface{} {
 
- 	old := *ss
 
- 	n := len(old)
 
- 	x := old[n-1]
 
- 	*ss = old[0 : n-1]
 
- 	return x
 
- }
 
- func findItinerary(tickets [][]string) (res []string) {
 
- 	m := make(map[string]StringSlice)
 
- 	for i := 0; i < len(tickets); i++ {
 
- 		ss := m[tickets[i][0]]
 
- 		heap.Push(&ss, tickets[i][1])
 
- 		m[tickets[i][0]] = ss
 
- 	}
 
- 	dfs(&m, "JFK", &res)
 
- 	for l, r := 0, len(tickets); l < r; l, r = l+1, r-1 {
 
- 		res[l], res[r] = res[r], res[l]
 
- 	}
 
- 	return res
 
- }
 
- func dfs(m *map[string]StringSlice, dst string, res *[]string) {
 
- 	for (*m)[dst].Len() != 0 {
 
- 		ss := (*m)[dst]
 
- 		next := heap.Pop(&ss).(string)
 
- 		(*m)[dst] = ss
 
- 		dfs(m, next, res)
 
- 	}
 
- 	*res = append(*res, dst)
 
- }
 
 
  |