《编程思维与实践》1040.字符串消除
题目
思路
每次消除都可能会受到第一次插入字符的影响,所以难以直接判断在哪个位置插入哪个字符后消除的字符数最多.
因此考虑暴力枚举:
在每个位置依此插入A,B,C 对所有情况消除的字符数进行比较,求出最大值.
对于字符串的插入可以利用strcpy函数:
如ABC在B前插入C,则可以通过拷贝ABC,第二位B变为C即ACC,再在第三位后拷贝BC进行覆盖变为ACBC来实现.
注意的点:
1.在消除字符串时需要对首位和最后一位进行单独讨论,其他位置判断与前后的字符是否一致.
2.消除的字符数可以定义为静态变量,需要注意返回结果后需要将其重新赋值为0.
3.在for循环中条件判断使用strlen作差时要当心结果小于0情况,因为strlen的返回值类型为unsigned int,
unsigned与int进行运算得到的结果为unsigned类型.
代码
#include<stdio.h>
#include<string.h>
char add[102]; //插入后的字符串
char result[102]; //消除后的字符串
void insert(char *s,int pos,char a)
{
strcpy(add,s); //拷贝
*(add+pos)=a; //覆盖插入位置
strcpy(add+pos+1,s+pos); //拷贝覆盖插入之后的位置
}
int solve(char *s)
{
static int count=0; //消除的字符数 静态变量
int j=0;
for(int i=0;i<strlen(s);i++)
{
if(i==0)
{
if(s[i]==s[i+1])
{
count++;
}
else
{
result[j++]=s[i];
}
}
else if(i==strlen(s)-1)
{
if(s[i]==s[i-1])
{
count++;
}
else
{
result[j++]=s[i];
}
}
else if(s[i]!=s[i+1]&&s[i]!=s[i-1])
{
result[j++]=s[i];
}
else
{
count++;
}
}
result[j]='\0';
int flag=0; //统计是否还有相同连续元素
for(int k=0;k<(int)strlen(result)-1;k++) //strlen-1可能小于0
{
if(result[k]==result[k+1])
{
flag=1;
break;
}
}
if(flag) //可以接着消
{
solve(result);
}
else //返回结果
{
int temp=count;
count=0; //需要将count重新初始化0
return temp;
}
}
int main()
{
int T;
scanf("%d",&T);
for(int i=0;i<T;i++)
{
int maxnum=0; //最多消除字符数
char s[101]; //长度不超过100
scanf("%s",s);
for(int j=0;j<=strlen(s);j++)
{
for(int k=0;k<3;k++) //依此插入A B C
{
insert(s,j,'A'+k);
solve(add);
maxnum=solve(add)>maxnum?solve(add):maxnum; //更新最多消除字符数
}
}
printf("case #%d:\n",i);
printf("%d\n",maxnum);
}
return 0;
}