|
@@ -1,31 +1,42 @@
|
|
|
type StringSlice []string
|
|
|
|
|
|
-func (ss StringSlice) Len() int { return len(ss) }
|
|
|
+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) 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{} {
|
|
|
- top := (*ss)[ss.Len()-1]
|
|
|
- *ss = (*ss)[:ss.Len()-1]
|
|
|
- return top
|
|
|
+ old := *ss
|
|
|
+ n := len(old)
|
|
|
+ x := old[n-1]
|
|
|
+ *ss = old[0 : n-1]
|
|
|
+ return x
|
|
|
}
|
|
|
|
|
|
-func findItinerary(tickets [][]string) []string {
|
|
|
- idx := make(map[string]int)
|
|
|
- adj := make([][]StringSlice, 0)
|
|
|
+func findItinerary(tickets [][]string) (res []string) {
|
|
|
+ m := make(map[string]StringSlice)
|
|
|
for i := 0; i < len(tickets); i++ {
|
|
|
- if id, ok := idx[tickets[i][0]]; !ok {
|
|
|
- id = len(idx)
|
|
|
- adj[id] = []StringSlice{tickets[i][1]}
|
|
|
- idx[tickets[i][0]] = id
|
|
|
- } else {
|
|
|
- heap.Push(&adj[id], tickets[i][1])
|
|
|
- }
|
|
|
+ ss := m[tickets[i][0]]
|
|
|
+ heap.Push(&ss, tickets[i][1])
|
|
|
+ m[tickets[i][0]] = ss
|
|
|
}
|
|
|
- return []string{}
|
|
|
+ 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)
|
|
|
}
|
|
|
|