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:
If there are multiple valid itineraries, you should return the itinerary that has the smallest lexical order when read as a single string. For example, the itinerary ["JFK", "LGA"] has a smaller lexical order than ["JFK", "LGB"]. All airports are represented by three capital letters (IATA code). You may assume all tickets form at least one valid itinerary.
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.
Credits:Special thanks to @dietpepsi for adding this problem and creating all test cases.
Solution
publicclassSolution {publicList<String> findItinerary(String[][] tickets) {List<String> result =newArrayList<>();if (tickets ==null||tickets.length==0|| tickets[0].length!=2) {return result; }Map<String,PriorityQueue<String>> graph =newHashMap<>();for(int i =0; i <tickets.length; i ++) {if (!graph.containsKey(tickets[i][0])) {graph.put(tickets[i][0],newPriorityQueue<>()); }graph.get(tickets[i][0]).add(tickets[i][1]); }dfs(graph,"JFK", result);Collections.reverse(result);return result; }privatevoiddfs(Map<String,PriorityQueue<String>> graph,String start,List<String> path) {while (graph.containsKey(start) &&!graph.get(start).isEmpty()) {String next =graph.get(start).poll();dfs(graph, next, path); }path.add(start); }}