- 题目
- 题解(15)
- 讨论(9)
- 排行
中等 通过率:30.18% 时间限制:1秒 空间限制:256M
知识点双指针

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
描述
在一款智能代码编辑器中,光标用字符 II 表示。初始时给出一个只包含字符 ((、))、II 的括号串,其中 恰好出现一次 II 作为光标位置。编辑器支持下列两种删除操作:
1. 1. backspace :
∘ ∘若光标左侧字符为 `(`,且光标右侧紧跟字符为 `)`,编辑器会一次性删除这对括号;
∘ ∘否则,若光标左侧仍有字符,则仅删除光标左侧一个字符;若左侧为空则无效果。
2. 2. delete :
∘ ∘若光标右侧存在字符,则删除光标右侧第一个字符;否则无效果。
给定初始括号串以及 kk 次操作序列(每次为 backspace 或 delete),请输出全部操作执行完毕后的最终字符串。
输入描述:
第一行输入两个整数 n,k(1≦k≦n≦2×105)n,k(1≦k≦n≦2×105)------初始字符串长度及操作次数。
第二行输入长度为 nn 的字符串 ss,仅包含 `(`, `)` 与 `I`,其中 II 恰好出现一次。
接下来 kk 行,每行输入一个操作类型:backspace 或 delete。
输出描述:
输出一行字符串,表示所有操作结束后的括号串。
示例1
输入:
10 3
((()(I))((
backspace
backspace
delete
复制输出:
(((I((
复制
示例2
输入:
5 3
((I))
backspace
backspace
delete
复制输出:
I
复制说明:
显然括号都被删除完了。
cpp
#include <iostream>
#include <string>
#include <vector>
#include <deque>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m;
cin >> n >> m;
string s;
cin >> s;
deque<char> left_q, right_q;
int cursor_pos = -1;
for (int i = 0; i < n; ++i) {
if (s[i] == 'I') {
cursor_pos = i;
break;
}
left_q.push_back(s[i]);
}
for (int i = cursor_pos + 1; i < n; ++i) {
right_q.push_back(s[i]);
}
for (int i = 0; i < m; ++i) {
string op;
cin >> op;
if (op == "backspace") {
if (!left_q.empty() && !right_q.empty() && left_q.back() == '(' && right_q.front() == ')') {
left_q.pop_back();
right_q.pop_front();
} else if (!left_q.empty()) {
left_q.pop_back();
}
} else { // delete
if (!right_q.empty()) {
right_q.pop_front();
}
}
}
for (char c : left_q) {
cout << c;
}
cout << 'I';
for (char c : right_q) {
cout << c;
}
cout << endl;
return 0;
}