Skip to content

Commit fd2a97f

Browse files
committed
444. Sequence Reconstruction
1 parent 6fd7660 commit fd2a97f

1 file changed

Lines changed: 63 additions & 0 deletions

File tree

‎444. Sequence Reconstruction.js‎

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/**
2+
* @param {number[]} org
3+
* @param {number[][]} seqs
4+
* @return {boolean}
5+
*/
6+
var sequenceReconstruction = function(org, seqs) {
7+
const edges = createGraph(seqs)
8+
const indegrees = createIndegrees(edges)
9+
const result = topologicalSort(edges, indegrees)
10+
if(result===false) return false
11+
return result.join()===org.join()
12+
};
13+
14+
function topologicalSort(edges, indegrees) {
15+
const result = []
16+
let candidate = []
17+
// find root
18+
for(let key in indegrees) {
19+
if(indegrees[key]===0) candidate.push(key)
20+
}
21+
22+
while(candidate.length!==0) {
23+
if(candidate.length>1) return false
24+
let src_key = candidate.shift()
25+
// find dest_key
26+
for(let key in edges) {
27+
if(key==src_key) { // loose comparison to pass '1'==1
28+
for(let dest_key of edges[src_key]) {
29+
indegrees[dest_key]--
30+
if(indegrees[dest_key]===0) candidate.push(dest_key)
31+
}
32+
}
33+
}
34+
result.push(src_key)
35+
}
36+
return result
37+
}
38+
39+
function createGraph(seqs) {
40+
const edges = {}
41+
for(let seq of seqs) {
42+
if(seq.length===1 && !(seq[0] in edges)) edges[seq[0]] = new Set()
43+
for(let i=0; i<seq.length-1; i++) {
44+
let src_key = seq[i]
45+
let dest_key = seq[i+1]
46+
if(!(src_key in edges)) edges[src_key] = new Set()
47+
edges[src_key].add(dest_key)
48+
}
49+
}
50+
return edges
51+
}
52+
53+
function createIndegrees(edges) {
54+
const in_degrees = {}
55+
for(let src_key in edges) {
56+
for(let dest_key of edges[src_key]) {
57+
if(!(dest_key in in_degrees)) in_degrees[dest_key] = 0
58+
in_degrees[dest_key]++
59+
}
60+
if(!(src_key in in_degrees)) in_degrees[src_key] = 0
61+
}
62+
return in_degrees
63+
}

0 commit comments

Comments
 (0)