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