Given a list of airline tickets represented by pairs of departure and arrival airports [from, to]
, reconstruct the itinerary in order. All of the tickets belong to a man who departs from JFK
. Thus, the itinerary must begin with JFK
.
Note:
["JFK", "LGA"]
has a smaller lexical order than ["JFK", "LGB"]
.
Example 1:
tickets
= [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
Return ["JFK", "MUC", "LHR", "SFO", "SJC"]
.
Example 2:
tickets
= [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
Return ["JFK","ATL","JFK","SFO","ATL","SFO"]
.
Another possible reconstruction is ["JFK","SFO","ATL","JFK","ATL","SFO"]
. But it is larger in lexical order.
DFS
We know the start point "JFK" and total itinerary length. Use map to store the tickets connect src and dest. Map<String, List<String>>, the list should be in ascending order. use dfs to go through the map, find the smallest lexical order
public List<String> findItinerary(String[][] tickets) { Map<String, List<String>> itineraryMap = new HashMap<>(); for(String[] ticket : tickets) { List<String> dests = itineraryMap.get(ticket[0]); if(dests == null) { dests = new ArrayList<>(); dests.add(ticket[1]); itineraryMap.put(ticket[0], dests); } else{ dests.add(ticket[1]); } } for(List<String> dests : itineraryMap.values()) { Collections.sort(dests); } List<String> res = new ArrayList<>(); res.add("JFK"); dfs(res, new ArrayList<String>(), itineraryMap, "JFK", tickets.length); return res; } private void dfs(List<String> res, List<String> cur, Map<String, List<String>> itineraryMap, String src, int len) { if(res.size() >1) { return; } if(cur.size() ==len) { res.addAll(cur); return; } List<String> dests = itineraryMap.get(src); if(dests != null && dests.size() >0) { for(int i=0;i<dests.size();i++) { String des = dests.remove(i); cur.add(des); dfs(res, cur, itineraryMap, des, len); dests.add(i, des); cur.remove(cur.size()-1); } } }