请判断原始的序列 org 是否可以从序列集 seqs 中唯一地 重建 。
序列 org 是 1 到 n 整数的排列。重建 是指在序列集seqs中构建最短的公共超序列,即seqs中的任意序列都是该最短序列的子序列。
示例
输入: org = [1,2,3], seqs = [[1,2],[1,3],[2,3]]
输出: true
解释:序列 [1,2], [1,3] 和 [2,3] 可以被唯一地重建为原始的序列 [1,2,3]。
示例
输入: org = [4,1,5,2,6,3], seqs = [[5,2,6,3],[4,1,5,2]]
输出: true
示例
输入: org = [1,2,3], seqs = [[1,2],[1,3]]
输出: false
解释:[1,2,3] 不是可以被重建的唯一的序列,因为 [1,3,2] 也是一个合法的序列。
示例
输入: org = [1,2,3], seqs = [[1,2]]
输出: false
解释: 可以重建的序列只有 [1,2]。
代码实现
var sequenceReconstruction = function (org, seqs) {
if (!seqs.length ) return false
var map = new Map()
var brr = new Array(org.length + 1).fill(0)
for (var arr of seqs) {
for (var i = 0; i < arr.length - 1; i++) {
if (arr[i] < 1 || arr[i] > org.length) return false
brr[arr[i + 1]]++
if (!map.get(arr[i])) {
map.set(arr[i], [arr[i + 1]])
} else {
map.set(arr[i], [...map.get(arr[i]), arr[i + 1]])
}
}
var value = arr[arr.length - 1]
if (value < 1 || value > org.length) return false
}
var queue = []
var index = 0
for (var i = 1; i < brr.length; i++) {
if (brr[i] === 0) {
if (queue.length === 0 && org[index++] === i) {
queue.push(i)
} else {
return false
}
}
}
while (queue.length) {
var item = queue.shift()
var mapArr = map.get(item)
if (mapArr) {
for (var i = 0; i < mapArr.length; i++) {
brr[mapArr[i]]--
if (brr[mapArr[i]] === 0) {
if (queue.length === 0 && org[index++] === mapArr[i]) {
queue.push(mapArr[i])
} else {
return false
}
}
}
}
}
return index === org.length
};