第一行输入两个整数
——初始字符串长度及操作次数。
第二行输入长度为
的字符串
,仅包含 `(`, `)` 与 `I`,其中
恰好出现一次。
接下来
行,每行输入一个操作类型:backspace 或 delete。
输出一行字符串,表示所有操作结束后的括号串。
10 3 ((()(I))(( backspace backspace delete
(((I((
5 3 ((I)) backspace backspace delete
I
显然括号都被删除完了。#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, k;
string s, op;
cin >> n >> k;
cin >> s;
//用数组标记当前位置是否被删除
vector<bool>isDelete(n, false);
int pos = s.find('I');//光标位置
int l = pos - 1, r = pos + 1;//定义左指针和右指针
while (k--) {
cin >> op;
//按照题目规则操作即可,每删除一次指针移动一步
if (op == "backspace") {
if (l >= 0 && r < n && s[l] == '(' && s[r] == ')') {
isDelete[l--] = true;
isDelete[r++] = true;
} else if (l >= 0)
isDelete[l--] = true;
} else if (r < n)
isDelete[r++] = true;
}
//由于n比较大,所以这里不判断标记,直接扫描未删除的区间
for (int i = 0; i <= l; i++)cout << s[i];
cout << 'I';//不要忘记中间的I
for (int i = r; i < n; i++)cout << s[i];
} #include <stdio.h>
#include <stdlib.h>
#include <string.h>
//感觉不是很难
//既然是用双指针的话,那就加上两个指针进行移动就行,这样就不用通过删除字符串上的字符构建新字符串的复杂操作了
int main() {
int n,k;
scanf("%d %d",&n,&k);
char* string=malloc(sizeof(char)*(n+1));//读取字符串
scanf("%s",string);
int I_pos;//找I字符所在下标的位置
int a,b; //指向I当前位置的左右两边
for (int i=0; i<n; i++) {
if(string[i]=='I')
{
I_pos=i;
a=I_pos-1;
b=I_pos+1;
}
}
for (int caozuo=1; caozuo<=k; caozuo++) { //读取每一次操作
char caozuo_string[10];
scanf("%s",caozuo_string);
if (strcmp(caozuo_string, "backspace")==0) { //根据操作指令进行双指针移动就行了
if (a>=0) { //ab不能超出范围
if (string[a]=='('&&string[b]==')') {
a--;//左右同时移动,相当于删除了
b++;
}else { //这种情况只需要删除a这边的就行了
a--;
}
}
}else if (strcmp(caozuo_string, "delete")==0) { //strcmp等于0才是相等啊
if(b<n) //b不超出范围就可以删除右边的
{
b++;
}
}
}
//然后输出0-a,b-n的部分剩余的内容即可
for (int i=0; i<=a; i++) {
printf("%c",string[i]);
}
printf("I");
for (int i=b; i<n; i++) {
printf("%c",string[i]);
}
return 0;
} import java.util.*;
import java.io.*;
// I两侧存为两个双端队列进行操作
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
String[] s=bf.readLine().split(" ");
int n=Integer.parseInt(s[0]);
int m=Integer.parseInt(s[1]);
String input=bf.readLine();
int indexI=input.indexOf('I');
Deque<Character> d1=new LinkedList<>();
Deque<Character> d2=new LinkedList<>();
for(int i=0;i<n;i++){
if(i<indexI){
d1.offerLast(input.charAt(i));
}
if(i>indexI){
d2.offerLast(input.charAt(i));
}
}
while(m>0){
if("backspace".equals(bf.readLine())){
if(!d1.isEmpty()&&!d2.isEmpty()&&d1.peekLast()=='('&&d2.peekFirst()==')'){
d1.removeLast();
d2.removeFirst();
}
else{
d1.pollLast();
}
}else{
d2.pollFirst();
}
m--;
}
for(char c:d1){
System.out.print(c);
}
System.out.print('I');
while(d2.peekFirst()!=null)
{
System.out.print(d2.pollFirst());
}
System.out.println();
}
}