第一行输入两个整数
——初始字符串长度及操作次数。
第二行输入长度为
的字符串
,仅包含 `(`, `)` 与 `I`,其中
恰好出现一次。
接下来
行,每行输入一个操作类型:backspace 或 delete。
输出一行字符串,表示所有操作结束后的括号串。
10 3 ((()(I))(( backspace backspace delete
(((I((
5 3 ((I)) backspace backspace delete
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;
}