剑指 Offer II 115. 重建序列

129 阅读1分钟

剑指 Offer II 115. 重建序列

请判断原始的序列 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
};