牛客在线编程_万万没想到之聪明的编辑
Keane1998 人气:2题目地址
给定字符串,连续三个相同的删除其中一个,连续两对的就删除第二对的其中一个,输出删除后的字符串。
- 字符串带有删除的模拟我习惯用链表来做,如果直接用数组打删除标记应该也是能做。
code
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+50;
int T;
char s[N];
struct node{
char c;
int next;
}ls[N];
int main(){
scanf("%d",&T);
while(T--){
scanf("%s",s+1);
int n=strlen(s+1);
for(int i=1;i<=n;i++){
ls[i]=node{s[i],i+1};
}
ls[n].next=-1;
int now=1;
while(now!=-1){
if(ls[now].next!=-1
&& ls[ls[now].next].next!=-1
&& ls[now].c==ls[ls[now].next].c
&& ls[now].c==ls[ls[ls[now].next].next].c){
ls[now].next=ls[ls[now].next].next;
}else if(ls[now].next!=-1
&& ls[ls[ls[now].next].next].next!=-1
&& ls[ls[now].next].next!=-1
&& ls[now].c==ls[ls[now].next].c
&& ls[ls[ls[now].next].next].c==ls[ls[ls[ls[now].next].next].next].c
&& ls[now].c!=ls[ls[ls[now].next].next].c){
ls[ls[now].next].next=ls[ls[ls[now].next].next].next;
}else{
now=ls[now].next;
}
}
now=1;
while(now!=-1){
printf("%c",ls[now].c);
now=ls[now].next;
}
printf("\n");
memset(ls,0,sizeof(node)*(n+5));
}
return 0;
}
加载全部内容