C++ 中的序列重建


假設我們必須檢查原始序列 org 是否可以從 seqs 中的序列唯一重建。原始序列是 1 到 n 的整數的排列,並且 n 的範圍為 1 ≤ n ≤ 10^4。這裡的重建意味著建立 seqs 中序列的最短公共超序列。我們必須檢查是否只有一個序列可以從 seqs 中重建,並且它是原始序列。

因此,如果輸入類似於 org = [1,2,3],seqs = [[1,2],[1,3]],則輸出將為 false,因為 [1,2,3] 不是唯一可以重建的序列,因為 [1,3,2] 也是可以重建的有效序列。

為了解決這個問題,我們將遵循以下步驟 -

  • 定義一個函式 ok(),它將接收 v1、v2,

  • 如果 v1 的大小不等於 v2 的大小,則 -

    • 返回 false

  • 對於初始化 i := 0,當 i < v1 的大小,更新(i 增加 1),執行 -

    • 如果 v1[i] 不等於 v2[i],則 -

      • 返回 false

  • 返回 true

  • 從主方法執行以下操作

  • n := 原始序列的大小

  • 定義一個大小為 (n + 1) 的陣列 graph

  • 定義一個對映 indegree

  • idx := 0

  • 對於初始化 i := 0,當 i < seqs 的大小,更新(i 增加 1),執行 -

    • 如果 seqs[i] 的大小 >= 1 且 (seqs[i, 0] > n 或 seqs[i, 0] < 1),則 -

      • 返回 false

    • 如果 seqs[i] 的大小 >= 1 且 indegree 中不包含 seqs[i, 0] 的計數,則 -

      • indegree[seqs[i, 0]] := 0

    • 對於初始化 j := 1,當 j < seqs[i] 的大小,更新(j 增加 1),執行 -

      • u := seqs[i, j - 1]

      • v := seqs[i, j]

      • 將 v 插入到 graph[u] 的末尾

      • (indegree[v] 增加 1)

      • 如果 u > n 或 v > n 或 u < 1 或 v < 1,則 -

        • 返回 false

  • 定義一個佇列

  • 對於初始化 i := 1,當 i <= n,更新(i 增加 1),執行 -

    • 如果 i 在 indegree 中且 indegree[i] 等於 0,則 -

      • 將 i 插入到 q 中

  • 當 (q 不為空) 時,執行 -

    • 如果 q 的大小 > 1,則 -

      • 返回 false

    • 如果 idx 等於 org 的大小,則 -

      • 返回 false

    • node := q 的第一個元素

    • 從 q 中刪除元素

    • 如果 org[idx] 不等於 node,則 -

      • 返回 false

    • (idx 增加 1)

    • 對於初始化 i := 0,當 i < graph[node] 的大小,更新(i 增加 1),執行 -

      • v := graph[node, i]

      • (indegree[v] 減少 1)

      • 如果 indegree[v] 等於 0,則 -

        • 將 v 插入到 q 中

  • 當 idx 等於 org 的大小時返回 true

示例

讓我們看看以下實現以獲得更好的理解 -

即時演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   bool ok(vector <int<& v1, vector <int<& v2){
      if (v1.size() != v2.size())
         return false;
      for (int i = 0; i < v1.size(); i++) {
         if (v1[i] != v2[i])
            return false;
      }
      return true;
   }
   bool sequenceReconstruction(vector<int<& org, vector<vector<int<>& seqs){
      int n = org.size();
      vector<int< graph[n + 1];
      unordered_map<int, int> indegree;
      int idx = 0;
      for (int i = 0; i < seqs.size(); i++) {
         if (seqs[i].size() >= 1 && (seqs[i][0] > n || seqs[i][0] < 1))
            return false;
         if (seqs[i].size() >= 1 && !indegree.count(seqs[i][0])) {
            indegree[seqs[i][0]] = 0;
         }
         for (int j = 1; j < seqs[i].size(); j++) {
            int u = seqs[i][j - 1];
            int v = seqs[i][j];
            graph[u].push_back(v);
            indegree[v]++;
            if (u > n || v > n || u < 1 || v < 1)
               return false;
         }
      }
      queue<int< q;
      for (int i = 1; i <= n; i++) {
         if (indegree.count(i) && indegree[i] == 0) {
            q.push(i);
         }
      }
      while (!q.empty()) {
         if (q.size() > 1) {
            return false;
         }
         if (idx == org.size()) {
            return false;
         }
         int node = q.front();
         q.pop();
         if (org[idx] != node) {
            return false;
         }
         idx++;
         for (int i = 0; i < graph[node].size(); i++) {
            int v = graph[node][i];
            indegree[v]--;
            if (indegree[v] == 0) {
               q.push(v);
            }
         }
      }
      return idx == org.size();
   }
};
main(){
   Solution ob;
   vector<int< v = {1,2,3};
   vector<vector<int<> v1 = {{1,2},{1,3}};
   cout << (ob.sequenceReconstruction(v, v1));
}

輸入

{1,2,3}, {{1,2},{1,3}}

輸出

0

更新於: 2020-11-19

184 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告