字符串操作
题目描述
初始一空串,给定以下操作(下述描述中,下标均从1开始)
INSERT_STR index substr: 在下标为index的位置插入字符串substr,操作结束后输出字符串,保证操作合法
DELETE_CHAR character: 删除字符串中所有的character字符,操作结束后输出字符串
DELETE_RANGE left right: 删除下标为[left, right]的子串,操作结束后输出字符串,保证操作合法
INSERT_REVERSE_STR: 将字符串自身反转后的串接在自身后,操作结束后输出字符串
REVERSE_STR: 将字符串反转,操作结束后输出字符串
COUNT_VOWEL: 统计元音数量之和(即aeiou的数量之和,注意包含大小写),操作结束后输出统计值
输入
测试数据只有一组
每行输入一个操作
操作以 OVER 结束
输入数据保证不超过1000行,字符串的长度保证始终不超过10000,字符串始终不存在空白字符
输出
具体输出见样例
样例输入
INSERT_STR 1 aeiou
INSERT_REVERSE_STR
DELETE_CHAR i
REVERSE_STR
COUNT_VOWEL
DELETE_RANGE 1 2
INSERT_STR 3 zzzzz
COUNT_VOWEL
OVER
样例输出
aeiou
aeiouuoiea
aeouuoea
aeouuoea
8
ouuoea
ouzzzzzuoea
6
提示
AC代码
#include<bits/stdc++.h>
using namespace std;
void charu(char a[1000],int n,char s[]);
void INSERT_REVERSE_STR(char a[1000]);
void DELETE_CHAR(char a[1000],char s[]);
void REVERSE_STR(char a[1000]);
void COUNT_VOWEL(char a[1000]);
void DELETE_RANGE(char a[1000],int n,int m);
int main()
{
int n,m;
char ch[1000],s[50];
ch[0]='\0';
while(cin>>s)
{
if(strcmp(s,"INSERT_STR")==0)
{
cin>>n>>s;
charu(ch,n,s);
}
else if(strcmp(s,"INSERT_REVERSE_STR")==0)
INSERT_REVERSE_STR(ch);
else if(strcmp(s,"DELETE_CHAR")==0)
{
cin>>s;
DELETE_CHAR(ch,s);
}
else if(strcmp(s,"REVERSE_STR")==0)
REVERSE_STR(ch);
else if(strcmp(s,"COUNT_VOWEL")==0)
COUNT_VOWEL(ch);
else if(strcmp(s,"DELETE_RANGE")==0)
{
cin>>n>>m;
DELETE_RANGE(ch,n,m);
}
else if(strcmp(s,"OVER")==0)
break;
}
}
void charu(char a[1000],int n,char s[])
{
int i,j,k1,k2;
k1=strlen(a);
k2=strlen(s);
for(i=k1;i>=n-1;i--)
{
a[i+k2]=a[i];
}
for(i=n-1,j=0;j<k2;i++,j++)
{
a[i]=s[j];
}
cout<<a<<"\n";
}
void INSERT_REVERSE_STR(char a[1000])
{
int i,k1;
k1=strlen(a);
for(i=k1;i<k1*2;i++)
{
a[i]=a[k1*2-i-1];
}
a[k1*2]='\0';
cout<<a<<"\n";
}
void DELETE_CHAR(char a[1000],char s[])
{
int i,j,flag,k1,k2;
k1=strlen(a);
k2=strlen(s);
for(i=0;i<k1;i++)
{
flag=0;
if(a[i]==s[0])
{
for(j=2;j<k2;j++)
{
if(a[i+j]!=s[j])
{
flag=1;
break;
}
}
if(flag==0)
{
for(j=i;j<k1;j++)
{
a[j]=a[j+k2];
}
}
k1--;
i--;
}
}
cout<<a<<"\n";
}
void REVERSE_STR(char a[1000])
{
int i,k1;
char c[1000];
k1=strlen(a);
for(i=0;i<k1;i++)
{
c[i]=a[k1-i-1];
}
c[k1]='\0';
strcpy(a,c);
cout<<a<<"\n";
}
void COUNT_VOWEL(char a[1000])
{
int i,n;
n=0;
for(i=0;i<strlen(a);i++)
{
if(a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u')
n++;
else if(a[i]=='A'||a[i]=='E'||a[i]=='I'||a[i]=='O'||a[i]=='U')
n++;
}
cout<<n<<"\n";
}
void DELETE_RANGE(char a[1000],int n,int m)
{
int i;
for(i=n-1;i<strlen(a);i++)
{
a[i]=a[i+m-n+1];
}
cout<<a<<"\n";
}
注意
删除那部分,如果少了i–,会出现abccdd→abcdd的情况即新进的那一位不会被检查到而保留下来。