Reconstruct Itinerary

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

public class Solution {
        public List<String> findItinerary(String[][] tickets) {
        List<String> result = new ArrayList<>();
        if (tickets == null || tickets.length == 0 || tickets[0].length != 2) {
            return result;
        }

        Map<String, PriorityQueue<String>> graph = new HashMap<>();
        for(int i = 0; i < tickets.length; i ++) {
            if (!graph.containsKey(tickets[i][0])) {
                graph.put(tickets[i][0], new PriorityQueue<>());
            }

            graph.get(tickets[i][0]).add(tickets[i][1]);
        }

        dfs(graph, "JFK", result);
        Collections.reverse(result);
        return result;
    }

    private void dfs(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);
    }
}

results matching ""

    No results matching ""