444. Sequence Reconstruction
Check whether the original sequence org
can be uniquely reconstructed from the sequences in seqs
. The org
sequence is a permutation of the integers from 1 to n, with 1 ≤ n ≤ 104. Reconstruction means building a shortest common supersequence of the sequences in seqs
(i.e., a shortest sequence so that all sequences in seqs
are subsequences of it). Determine whether there is only one sequence that can be reconstructed from seqs
and it is the org
sequence.
Example 1:
Input: org: [1,2,3], seqs: [[1,2],[1,3]] Output: false Explanation: [1,2,3] is not the only one sequence that can be reconstructed, because [1,3,2] is also a valid sequence that can be reconstructed.
Example 2:
Input: org: [1,2,3], seqs: [[1,2]] Output: false Explanation: The reconstructed sequence can only be [1,2].
Example 3:
Input: org: [1,2,3], seqs: [[1,2],[1,3],[2,3]] Output: true Explanation: The sequences [1,2], [1,3], and [2,3] can uniquely reconstruct the original sequence [1,2,3].
Example 4:
Input: org: [4,1,5,2,6,3], seqs: [[5,2,6,3],[4,1,5,2]] Output: true
先判断seqs里的每一个seq是否是org里的子序列,首先记载每个元素在org中的下标,如果子序列的元素中,后面元素的下标比前面的小,则不是子序列。然后,对于判断由这些子序列是否可以重构原始的org。则后面的seqs中必须满足一下条件,对于org中任意相邻的两个数x和y,在seqs中必定存在相邻的x和y来表示它们的相对次序。否则,x和y的位置是可交换的,与题目中的唯一重构的要求相悖。这里用set<pair<int,int>>来记录seqs中所有的相邻对组,如果org中的某个x和y组成的对组不能在set中找到,返回false.
class Solution {
public:
bool sequenceReconstruction(vector<int>& org, vector<vector<int>>& seqs) {
int n=org.size();
if(!seqs.size()) return false;
vector<int> idx(n+1);
set<pair<int,int>> s;
for(int i=0;i<n;i++)
idx[org[i]]=i;
for(auto seq:seqs)
{
for(int i=0;i<seq.size();i++)
{
if(seq[i]<1||seq[i]>n)
return false;
if(idx[seq[i]]<0||idx[seq[i]]>=n)
return false;
if(i>0&&idx[seq[i]]<idx[seq[i-1]])
return false;
if(i>0)
s.insert(pair<int,int>(seq[i-1],seq[i]));
}
}
for(int i=1;i<n;i++)
{
pair<int,int> t(org[i-1],org[i]);
if(s.find(t)==s.end())
return false;
}
return true;
}
};