《编程思维与实践》1040.字符串消除

《编程思维与实践》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类型.

代码

1.静态变量存储:

#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)  //可以接着消
	{
    
    
		return 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;
}

2.直接作差:

#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)
{
    
    
    int j=0;
	for(int i=0;i<strlen(s);i++)
    {
    
    
        if(i==0&&s[i]!=s[i+1])
        {
    
    
            result[j++]=s[i];
        }
        else if(i==strlen(s)-1&&s[i]!=s[i-1])
        {
    
    
        	result[j++]=s[i];
        }
        else if(s[i]!=s[i+1]&&s[i]!=s[i-1])
        {
    
    
            result[j++]=s[i];
        }
    }
	result[j]='\0';
	int flag=0;  //统计是否还有相同连续元素 
	
	for(int k=0;k<(int)strlen(result)-1;k++)
	{
    
    
		if(result[k]==result[k+1])
		{
    
    
			flag=1;
            break;
		}
	}
	if(flag)
	{
    
    
		return solve(result);
	}
    else
    {
    
    
        return strlen(add)-strlen(result);
    }
} 

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;
}

猜你喜欢

转载自blog.csdn.net/boxueyuki/article/details/130418314