//https://leetcode.com/problems/sequence-reconstruction/submissions/ /** Example 1: Input: org: [1,2,3], seqs: [[1,2],[1,3]] Output: false Explanation: [1,2,3] is not the only one sequence that can be reconstructed, because [1,3,2] is also a valid sequence that can be reconstructed. Example 2: Input: org: [1,2,3], seqs: [[1,2]] Output: false Explanation: The reconstructed sequence can only be [1,2]. Example 3: Input: org: [1,2,3], seqs: [[1,2],[1,3],[2,3]] Output: true Explanation: The sequences [1,2], [1,3], and [2,3] can uniquely reconstruct the original sequence [1,2,3]. Example 4: Input: org: [4,1,5,2,6,3], seqs: [[5,2,6,3],[4,1,5,2]] Output: true **/ class Solution { public boolean sequenceReconstruction(int[] org, List> seqs) { if(org.length == 0 && seqs.size() == 0) return true; if(org.length == 0 || seqs.size() == 0) return false; HashMap> adj = new HashMap<>(); HashMap inDegree = new HashMap<>(); for(int n : org){ adj.put(n,new LinkedList<>()); inDegree.put(n,0); } for(List seq : seqs){ if(seq.size() == 1){ int node1 = seq.get(0); if(!inDegree.containsKey(node1)) return false; } for(int i = 1 ; i < seq.size() ; i ++){ int node1 = seq.get(i-1); int node2 = seq.get(i); if(adj.get(node1) == null) return false; // bakwas edge case List list = adj.get(node1); list.add(node2); adj.put(node1 , list); if(inDegree.get(node2) == null) return false; // bakwas edge case inDegree.put(node2 ,inDegree.get(node2)+1); } } Queue queue = new LinkedList<>(); for(int n : org){ if(inDegree.get(n) == 0){ queue.offer(n); } } List orderList = new LinkedList<>(); while(queue.size() > 0){ if(queue.size() > 1) return false; int node = queue.poll(); orderList.add(node); for(int next : adj.get(node)){ inDegree.put(next , inDegree.get(next) -1); if(inDegree.get(next) == 0) queue.offer(next); } } if(orderList.size() !=org.length) return false; for(int i=0 ; i< org.length ; i++){ if(org[i] != orderList.get(i)) return false; } return true; } }