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
public List findItinerary(String[][] tickets) {
Map> itineraryMap = new HashMap<>();
for(String[] ticket : tickets) {
List 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 dests : itineraryMap.values()) {
Collections.sort(dests);
}
List res = new ArrayList<>();
res.add("JFK");
dfs(res, new ArrayList(), itineraryMap, "JFK", tickets.length);
return res;
}
private void dfs(List res, List cur, Map> itineraryMap, String src, int len) {
if(res.size() >1) {
return;
}
if(cur.size() ==len) {
res.addAll(cur);
return;
}
List dests = itineraryMap.get(src);
if(dests != null && dests.size() >0) {
for(int i=0;i