文章目录
- 1. 题目
- 2. 解题
1. 题目
验证原始的序列 org 是否可以从序列集 seqs 中唯一地重建。
序列 org 是 1 到 n 整数的排列,其中 1 ≤ n ≤ 104。
重建是指在序列集 seqs 中构建最短的公共超序列。(即使得所有 seqs 中的序列都是该最短序列的子序列)。
确定是否只可以从 seqs 重建唯一的序列,且该序列就是 org 。
示例 1:
输入:
org: [1,2,3], seqs: [[1,2],[1,3]]
输出:
false
解释:
[1,2,3] 不是可以被重建的唯一的序列,因为 [1,3,2] 也是一个合法的序列。示例 2:
输入:
org: [1,2,3], seqs: [[1,2]]
输出:
false
解释:
可以重建的序列只有 [1,2]。示例 3:
输入:
org: [1,2,3], seqs: [[1,2],[1,3],[2,3]]
输出:
true
解释:
序列 [1,2], [1,3] 和 [2,3] 可以被唯一地重建为原始的序列 [1,2,3]。示例 4:
输入:
org: [4,1,5,2,6,3], seqs: [[5,2,6,3],[4,1,5,2]]
输出:
true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sequence-reconstruction
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
class Solution {
public:bool sequenceReconstruction(vector<int>& org, vector<vector<int>>& seqs) {int n = org.size();vector<bool> exit(n+1, false);//是否存在vector<vector<int>> g(n+1);//图vector<int> indegree(n+1, 0);//入度for(auto& s : seqs){int from = -1;for(int i = 0; i < s.size(); ++i){if(s[i] <= 0 || s[i] > n) return false;//编号超了exit[s[i]] = true;if(from != -1){g[from].push_back(s[i]);//边indegree[s[i]]++;//入度+1}from = s[i];}}queue<int> q;for(int i = 1; i <= n; ++i){if(!exit[i]) return false;//有的点不存在if(indegree[i]==0)//入度为0的入队q.push(i);}int i = 0;while(!q.empty()){if(q.size() != 1) return false;//选择不唯一int cur = q.front();if(cur != org[i++]) return false;//跟序列不匹配q.pop();for(int i = 0; i < g[cur].size(); ++i){if(--indegree[g[cur][i]] == 0)q.push(g[cur][i]);//入队为0 的入队}}if(i != n) return false;//有环return true;}
};
216 ms 45.2 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!