package com.interview.recursion; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Date 03/08/2016 * @author Tushar Roy * * Reconstruct itinerary based on ticket. * * https://leetcode.com/problems/reconstruct-itinerary/ */ public class ReconstructItinerary { public List<String> findItinerary(String[][] tickets) { List<Itinerary> input = new ArrayList<>(); for (String[] ticket : tickets) { input.add(new Itinerary(ticket[0], ticket[1])); } Collections.sort(input); List<String> output = new ArrayList<>(); boolean[] used = new boolean[input.size()]; findItineraryUtil(input, used, "JFK", output, 0); return output; } boolean findItineraryUtil(List<Itinerary> input, boolean[] used, String end, List<String> output, int count) { if (count == used.length) { output.add(end); return true; } for (int i = 0; i < input.size(); i++) { if (used[i]) { continue; } Itinerary itr = input.get(i); if (itr.start.equals(end)) { output.add(itr.start); used[i] = true; if (findItineraryUtil(input, used, itr.dest, output, count + 1)) { return true; } used[i] = false; output.remove(output.size() - 1); } } return false; } class Itinerary implements Comparable<Itinerary> { String start; String dest; Itinerary(String start, String dest) { this.start = start; this.dest = dest; } @Override public int compareTo(Itinerary other) { if (this.start.equals(other.start)) { return this.dest.compareTo(other.dest); } else { return this.start.compareTo(other.start); } } } public static void main(String args[]) { String input[][] = {{"MUC","LHR"},{"JFK","MUC"},{"SFO","SJC"},{"LHR","SFO"}}; ReconstructItinerary ri = new ReconstructItinerary(); List<String> output = ri.findItinerary(input); output.forEach(r -> System.out.print(r + " ")); } }