444. Sequence Reconstruction
Check whether the original sequenceorg
can be uniquely reconstructed from the sequences inseqs
. Theorg
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 inseqs
(i.e., a shortest sequence so that all sequences inseqs
are subsequences of it). Determine whether there is only one sequence that can be reconstructed fromseqs
and it is theorg
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
S1: topological sort
S2: 观察 (这种解法没有多少意义)
若要满足题意需满足两个条件:
seqs里的每个序列都是org的子序列,且在orig里相邻的两数在seqs里也一定相临
bool sequenceReconstruction(vector<int>& org, vector<vector<int>>& seqs) {
if(seqs.empty()) return false;
vector<int> pos(org.size()+1);
for(int i=0;i<org.size();++i) pos[org[i]] = i;
bool isVisited = false;
vector<char> flags(org.size()+1,0);
int toMatch = org.size()-1;
for(const auto& v : seqs) {
for(int i=0;i<v.size();++i) {
isVisited = true;
if(v[i] <=0 || v[i] >org.size())return false;
if(i==0)continue;
int x = v[i-1], y = v[i];
if(pos[x] >= pos[y]) return false;
if(flags[x] == 0 && pos[x]+1 == pos[y]) flags[x] = 1, --toMatch;
}
}
return toMatch == 0 && isVisited;
}