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

news2025/1/19 2:27:34

《编程思维与实践》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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/470305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这个看过吗

el-upload调两个接口&#xff0c;获取二进制文件 &#xff0c;并且上传后不立即执行&#xff0c;通过 this.$refs.upload.submit();触发提交&#xff0c;直接调两个接口&#xff0c;获取到二进制文件后传输 <el-upload:auto-upload"false":data"{report…

springboot+vue在线动漫信息平台(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线动漫信息平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

TPS和QPS的区别与联系

今天在工作中遇到了两个指标&#xff0c;将这两个指标作以解析。 1、TPS&#xff1a; Transactions Per Second&#xff0c;意思是每秒事务数。一个事务是指客户端向服务器发送请求然后服务器做出反应的过程&#xff0c;具体的事务定义&#xff0c;可以是一个接口、多个接口、…

IDEA中application.yaml文件无法自动提示

问题描述&#xff1a; 在IDEA中application.properties可以自动提示&#xff0c;但是application.yml/application.yaml文件却不可以实现关键词提示和代码跳转 甚至&#xff0c;在Modules模块中都无法识别到application.yml文件&#xff01;&#xff01; 总感觉这个yml文件图标…

【C++学习】类和对象--继承

基本语法 继承是面向对象三大特性之一&#xff0c;有些类和类之间存在特殊关系。 下级别成员除了拥有上一级的共性还有自己的特点。 这个时候我们就可以考虑利用继承的技术&#xff0c;减少重复代码。 基本语法&#xff1a;class 子类 &#xff1a;继承方式 父类 子类也称为…

【HTML 标签详解】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

MySQL(三)-数据类型

MYSQL数据类型 1 整数类型2 浮点数类型和定点数类型3 日期与时间类型4 文本字符串类型5 二进制字符串类型6 数据类型的选择 表是由多列字段组成&#xff0c;每一个字段会有不同的数据类型&#xff0c;不同的数据类型决定了字段包含的数据内容。不同的数据类型也决定了mysql在使…

SpringBoot项目结构及依赖技术栈

目录 1、pom.xml文件配置说明 2、SpringBoot项目结构说明 3、入门案例关键配置说明 &#x1f308; 前面我们学习了SpringBoot快速入门案例&#xff0c;本节我们通过POM文件和项目结构分析两部分内容了解下关于SpringBoot的一些配置说明&#xff0c;以便全面了解SpringBoot项…

Javaweb | 转发、重定向

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 转发 转发与页面跳转 转发 转发的作用在服务器端&#xff0c;将请求发送给服务器上的其他资源&#xff0c;以共同完成一次请求的处理 页面跳转 使用forward跳转时&am…

MySQL(七)-日期和时间函数的使用解析

日期和时间函数的使用解析 1 获取当前日期的函数和获取当前时间的函数2 获取当前日期和时间的函数3 UNIX时间戳函数4 返回UTC日期的函数和返 UTC 时间的函数5 获取月份的函数MONTH(date)和 MONTHNAME(date)6 获取星期的函数DAYNAME(d)DAYOFWEEK(d)和WEEKDAY(d)7 获取星期数的函…

芯片封装基本流程及失效分析处理方法

芯片封装 芯片封装的目的在于对芯片进行保护与支撑作用、形成良好的散热与隔绝层、保证芯片的可靠性&#xff0c;使其在应用过程中高效稳定地发挥功效。 工艺流程 硅片减薄 使用物理手段&#xff0c;如磨削、研磨等&#xff1b;或者化学手段&#xff0c;如电化学腐蚀、湿法腐蚀…

2023-04-24:用go语言重写ffmpeg的muxing.c示例。

2023-04-24&#xff1a;用go语言重写ffmpeg的muxing.c示例。 答案2022-04-24&#xff1a; 本程序的大体过程如下&#xff1a; 打开输出文件并写入头部信息。 添加音频和视频流&#xff0c;并为每个流创建 AVCodecContext 对象&#xff0c;根据输入格式设置编码器参数&#x…

springboot 整合itext 实现pdf下载

一 itext介绍 1.1 核心组件介绍 Text中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。 1.文本块(Chunk)是处理文本的最小单位&#xff0c;有一串带格式&#xff08;包括字体、颜色、大小&#xff09;的字符串组成。如以下代码就是产生一个字体为HELVETICA、大小为…

【OAI】UERANSIM容器与OAI核心网分立部署及测试

说明启动核心网&#xff1a;启动基站&#xff1a;功能测试ueransim测试1&#xff1a;通过12.1.1.x ping192.168.70.1ueransim测试2&#xff1a; 通过nr-binder绑定自定义TCP程序传数据到核心网ueransim测试3&#xff1a;多ueransim启动 结论附录基站配置文件&#xff1a;TCP通信…

HCIA-RS实验-路由配置-静态路由缺省路由

在计算机网络中&#xff0c;路由器是实现数据包转发的重要设备。它通过查找路由表中的路由信息&#xff0c;将数据包从源地址转发到目标地址。而静态路由和缺省路由则是路由表中的两种重要信息&#xff0c;下面我们来详细了解一下它们的概念、特点和应用。 目录 简述 一、静态…

Let‘s Learn .NET|通过 Semantic Kernel .NET SDK 管理你的 OpenAI 项目

编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun Lets Learn .NET 系列 “Lets Learn .NET” 是面向全球的 .NET 初学者学习系列&#xff0c;旨在通过不同语言&#xff0c;帮助不同地区的开发者掌握最新的 .NET 开发知识与技能。 在 ChatGPT 与 OpenAI 火热的当下&#x…

雪花算法

雪花算法(SnowFlake)&#xff0c;是Twitter开源 的分布式ID生成算法 主要是由 64bit 的 long 型生成的全局 ID&#xff0c; 其中分为四个部分&#xff1a; ① 最高1位固定值 0&#xff0c;因为生成的 id 是正整数 ② 后面的41位存储毫秒级时间戳 ③ 第三部分的10位存储机器码…

tp6.1 bingher/ueditor(百度编辑器)(七牛、阿里OSS第三方云)详情图文教程(第二版)

之前做过一版&#xff1a;tp6 bingher/ueditor(百度编辑器)(七牛、阿里OSS第三方云)详情图文教程_我是高手高手高高手的博客-CSDN博客 登录权限是Session&#xff0c;现在系统是Cookie加jwt的Token方式验证 一、修改验证登录权限 修改文件&#xff1a; vendor\bingher\uedito…

R语言 | 向量对象运算

目录 一、数值型的向量对象 1.1 建立规则型的数值向量对象使用序列符号 1.2 简单向量对象的运算 1.3 建立向量对象&#xff1a;seq()函数 1.4 连接向量对象&#xff1a;c()函数 1.5 重复向量对象&#xff1a;rep()函数 1.6 numeric()函数 1.7 程序语句短语跨行的处理 …

阶段式软件研发项目管理工具

下面这个场景是是阶段式软件研发场景&#xff0c;适用于采用瀑布模式开展软件研发的企业或者团队。 创建项目 新建项目时&#xff0c;使用“阶段式软件开发项目”项目模板创建项目。 系统会自动创建10个阶段看板&#xff08;一个阶段一个看板&#xff09;&#xff0c;1个缺陷…