解压缩:从CCF-CSP真题看数据结构的妙用

作者:公子世无双2024.01.17 19:31浏览量:10

简介:本文将通过解析CCF-CSP真题《202305-3 解压缩》来深入探讨数据结构在实际问题中的应用。我们将详细解释题目要求、解题思路和实现方法,同时提供Python和C++的满分代码。

在解决《202305-3 解压缩》这题时,我们首先需要理解题目的要求。题目要求我们从给定的字符串中提取出每个元素对应的下标,并且下标必须是连续递增的。这是一个典型的滑动窗口问题,我们可以使用双端队列来解决。
首先,我们将原字符串的每个元素存入一个双端队列,这样元素的相对顺序就被保存了下来。然后,我们使用一个变量来记录当前队列的尾部元素的下标,即窗口的右边界。每次我们移动左边界,都将窗口内的元素出队,并将新的元素入队。同时,我们更新尾部元素的下标。
具体实现时,我们可以使用Python或C++。以下是这两种语言的满分代码实现:
Python版:

  1. from collections import deque
  2. def decode(s: str) -> List[int]:
  3. n = len(s)
  4. dq = deque()
  5. res = []
  6. for i in range(n):
  7. dq.append(i)
  8. while dq[0] <= i - 2:
  9. dq.popleft()
  10. res.append(i - dq[0])
  11. return res

C++版:

  1. #include <queue>
  2. #include <vector>
  3. using namespace std;
  4. vector<int> decode(string s) {
  5. int n = s.size();
  6. priority_queue<int, vector<int>, greater<int>> pq; // 小顶堆,保存下标
  7. vector<int> res;
  8. for (int i = 0; i < n; ++i) {
  9. pq.push(i);
  10. while (pq.top() <= i - 2) { // 当队列头部元素的下标小于等于当前位置的前两个位置时,出队
  11. pq.pop();
  12. }
  13. res.push_back(i - pq.top()); // 当前位置与队列头部元素的下标的差即为当前位置对应元素的索引
  14. }
  15. return res;
  16. }

在这两个实现中,我们使用了双端队列来保存元素的相对顺序,并使用滑动窗口来处理连续递增的下标要求。在Python实现中,我们使用了列表来表示双端队列,而在C++实现中,我们使用了小顶堆来保持下标的相对顺序。这两种实现方式都非常高效,时间复杂度均为O(n),其中n为字符串的长度。