字符串变换最小字符串(C语言)

题目描述

给定一个字符串s,最多只能进行一次变换,返回变换后能得到的最小字符串(按照字典序进行比较)。

变换规则:交换字符串中任意两个不同位置的字符。

输入描述

一串小写字母组成的字符串s

输出描述

按照要求进行变换得到的最小字符串。

用例

输入abcdef
输出abcdef
说明abcdef已经是最小字符串,不需要交换。
输入bcdefa
输出acdefb
说明a和b进行位置交换,可以得到最小字符串。

备注

s是都是小写字符组成

1<=s.length<=1000

代码

// 引入必要的头文件,用于输入输出和字符串操作
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定义一个常量,表示字符串的最大长度
#define MAX_LEN 1000// 自定义比较函数cmp,用于qsort对字符数组进行字典序排序
int cmp(const void *a, const void *b) {// 返回两个字符的ASCII码之差,使得字符按字典序排列return *(char *)a - *(char *)b;
}int main() {// 定义原始字符串s,并读取用户输入的字符串内容char s[MAX_LEN];scanf("%s", s);// 计算字符串s的长度int len = strlen(s);// 创建一个新的字符数组sorted_s,用于存储原始字符串s排序后的副本char sorted_s[MAX_LEN];strcpy(sorted_s, s);// 使用qsort对sorted_s进行升序排序qsort(sorted_s, len, sizeof(char), cmp);// 比较排序后与原始字符串,如果相同则无需交换,直接输出原始字符串并返回if (strcmp(sorted_s, s) == 0) {printf("%s", s);return 0;}// 遍历原始字符串,寻找第一个未在正确位置上的字符for (int i = 0; i < len; i++) {if (s[i] != sorted_s[i]) {// 找到该字符在排序后字符串中的正确位置(索引)int index;for (int j = 0; j < len; j++) {if (sorted_s[i] == s[j]) {index = j;//注意:这里没有加break;//s:afcdbb, sorted_s:abbcdf,index应该是最后一个b的位置,这样s变成abcdbf而不是abcdfb,abcdbf的字典序比abcdfb小}}// 交换原始字符串中找到的错误字符与其正确位置上的字符char tmp = s[i];s[i] = sorted_s[i];s[index] = tmp;// 由于我们只允许一次交换,所以找到一对字符后就可以结束循环break;}}// 输出经过变换后得到的最小字符串printf("%s\n", s);// 主函数返回0表示程序正常执行完毕return 0;
}

注意;

“最小字典序字符串”是什么意思?

“最小字典序字符串”是指在一个给定的字符集合中,按照特定排序规则(通常是字母表顺序或数字大小顺序)排列起来形成的字符串中,排在最前面的那个字符串。在计算机科学和数学中,这种排序规则通常基于ASCII码或者Unicode编码的值。

对于由小写字母组成的字符串而言,最小字典序字符串意味着字母按照英文字母表从前往后依次排列。例如,在所有可能的6个字符长度的字符串中,“abcdef”是比“abcdeg”、“abcfed”等其他字符串字典序更小的字符串,因为它的每个字符都在字母表上位置靠前。

当题目要求求解一个字符串变换后的最小字典序字符串时,目标是通过允许的操作(如交换字符、删除字符等)使得最终得到的字符串在其所有可能变化形式中处于字典序排序上的最前端。

为什么“遍历原始字符串,寻找第一个未在正确位置上的字符;交换原始字符串中找到的错误字符与其正确位置上的字符”就可以求出“最小字典序字符串”

在给定的变换规则下,要通过一次交换操作使字符串变为字典序最小,我们需要找到的是这样一对字符:其中一个字符原本位于它应该在排序后出现的位置之前,并且这个字符与它后面应当出现在该位置上的字符进行交换。

例如,如果字符串是 “bcdefa”,按照字典序排列应该是 “abcdef”。那么,我们发现 ‘a’ 字符在原始字符串中的位置(索引为 5)比它在排序后的正确位置(索引为 0)靠后。因此,将 ‘a’ 与它前面的一个字符(这里是 ‘b’)交换位置,得到 “acdefb”,此时字符串变成了字典序上可能的最小值。

这个策略的核心在于:

  1. 字典序最小意味着所有字符都应该尽可能地向左移动。
  2. 因此,我们应该优先考虑那些位于排序后对应位置之后的字符,并将其与当前所在位置之前的字符交换,以使其移动到更靠前的位置。

代码中通过遍历原字符串并比较其与已排序字符串对应位置的字符来定位需要交换的一对字符,一旦找到这样的字符对就立即进行交换,并且由于题目只允许一次交换,所以在完成首次交换后就会结束循环。这样处理的结果就是得到了字典序上仅通过一次交换能得到的最小字符串。

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

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

相关文章

ADO.NET查询返回单个值

在ADO.NET中&#xff0c;如果你想要执行一个查询并返回单个值&#xff08;例如&#xff0c;一个聚合函数的结果或一个唯一记录的某个字段值&#xff09;&#xff0c;你可以使用SqlCommand对象的ExecuteScalar方法。ExecuteScalar方法返回查询结果集中的第一行的第一列的值&…

国内最全的AIGC大模型软件都是免费的,不比chatgpt香吗?我都为你准备好了,又可以提前下班了

无极低码 &#xff1a;https://wheart.cn 豆包(云雀大模型)、文心一言、悟空、星火、百度文库、360智脑、天宫AI、智谱清言(GLM大模型)、百川模型(百川智能)、日日新(商汤)、上海人工智能实验室&#xff08;书生通用大模型&#xff09;、夸克。 国内最全的AIGC大模型软件都是…

mysql 2-21

约束的分类 添加约束 查看表约束 非空约束 唯一性约束 复合的唯一性约束 只要有一个字段不重复&#xff0c;就可以添加成功 主键约束 自增列 mysql 8.0具有持久化&#xff0c;重启服务器会继续自增 外键约束 创建外键 关联必须有唯一性约束&#xff0c;或者是主键 约束等级 …

MySQL篇之undo log和redo log

一、持久化时服务器宕机 缓冲池&#xff08;buffer pool&#xff09;: 主内存中的一个区域&#xff0c;里面可以缓存磁盘上经常操作的真实数据&#xff0c;在执行增删改查操作时&#xff0c;先操作缓冲池中的数据&#xff08;若缓冲池没有数据&#xff0c;则从磁盘加载并缓存&a…

Python科学计算:SymPy、Numba与SciPy库

Python在科学计算领域的应用非常广泛&#xff0c;其中SymPy、Numba和SciPy是三个常用的库。这些库各自有不同的特点和应用场景。 SymPy SymPy是一个Python的库&#xff0c;用于进行符号数学计算。它允许你进行符号计算&#xff0c;如代数、微积分、离散数学、量子力学、统计学…

jsx语言和js语言的区别

JSX 是 JavaScript 的一种语法扩展&#xff0c;它允许在 JavaScript 代码中直接编写类似 HTML 的标记&#xff0c;用于描述用户界面的结构。JSX 最常用于 React 应用程序中&#xff0c;但也可以与其他框架或库一起使用。 下面是 JSX 和普通 JavaScript 的一些区别&#xff1a;…

C++面试:TCP和UDP的基本原理http协议基础与应用http协议相关知识

目录 TCP和UDP的基本原理 TCP (传输控制协议) UDP (用户数据报协议) 应用场景 TCP可靠传输机制 TCP协议的流量控制和拥塞控制 TCP流量控制 TCP拥塞控制 区别 Session、Cookie 与 Application 1. Cookie 2. Session 3. Application 比较 http1.0、http2.0、http…

我是如何从功能测试成功转岗测试开发的?记录下我的面试经验

由于这段时间我面试了很多家公司&#xff0c;也经历了之前公司的不愉快。所以我想写一篇文章来分享一下自己的面试体会。希望能对我在之后的工作或者面试中有一些帮助&#xff0c;也希望能帮助到正在找工作的你。 一 找工作 壹&#xff0f; 我们总是草率地进入一个自己不了解…

mac拼图软件有哪些?推荐5款拼图软件

mac拼图软件有哪些&#xff1f;在数字图像处理中&#xff0c;拼图软件扮演着至关重要的角色。对于Mac用户来说&#xff0c;选择一款功能强大、操作简便的拼图软件是提升工作效率和创作体验的关键。本文将为你介绍五款优秀的Mac拼图软件&#xff0c;帮助你轻松完成图片拼接、制作…

ffmpeg之avformat_alloc_output_context2

函数原型: int avformat_alloc_output_context2(AVFormatContext **ctx, const AVOutputFormat *oformat,const char *format_name, const char *filename); 功能: 查找根据format_name或者filename或者oformat输出类型,并且初始化ctx结构。 参数: ctx:AVFormatContext…

WEB APIs (3)

事件对象 事件对象有事件触发时的相关信息&#xff0c;如点击事件中事件对象储存了鼠标点在哪个位置的信息 场景&#xff1a; 用户按下了哪个键&#xff0c;按下回车键可以发布新闻 鼠标点击了哪个元素&#xff0c;从而做哪些操作 参数e为事件对象 常用属性 type 获取当前…

如何用微软画图把1280X720的图片压缩成4:3?

最近在看20多年前的电视剧&#xff0c;视频截图是1280X720&#xff0c;比例失调。 如何压缩成4:3&#xff1f; 4 / 3 W / 720 W 720 X 4 / 3 960 打开画图&#xff0c;调整大学和扭曲&#xff08;Ctrl W&#xff09;&#xff0c;依据选择像素&#xff0c;取消保持纵横比…

【C++】类和对象---const成员,取地址及const取地址操作符重载,static成员

目录 ⭐const成员 ⭐取地址及const取地址操作符重载 ⭐static成员 ⭐概念 ⭐特性 ⭐const成员 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的任何…

Nginx服务介绍与部署管理

目录 一、Nginx相关介绍 1. 概述 2. 优缺点 3. 零拷贝技术 4. I/O模型相关概念 5. 网络I/O模型 5.1 阻塞型I/O模型 5.2 非阻塞型I/O模型 5.3 多路复用I/O型 5.4 信号驱动式I/O模型 5.5 异步I/O模型 6. 事件驱动模型 7. Nginx与Apache区别 二、Nginx部署和使用 1…

开源大数据管理平台

目前两大开源大数据平台CDH和HDP已闭源&#xff0c;国内也涌现出了一些开源的大数据平台&#xff0c;比如&#xff1a;apache bigtop 和 DataSophon。当前这两个产品都是完全开源的&#xff0c;并且这两个项目提供了源码和编译文档自助可控。 一、apache bigtop 项目地址&…

哪些工具可以改变手机电脑网络IP地址?

在互联网时代&#xff0c;网络已经成为了我们日常生活中不可或缺的一部分。然而&#xff0c;随着网络的普及和技术的不断发展&#xff0c;网络安全问题也日益凸显。为了保护个人隐私和信息安全&#xff0c;我们需要了解一些工具可以改变手机电脑网络IP地址的知识。 首先&#x…

【Java面试】MQ(Message Queue)消息队列

目录 一、MQ介绍二、MQ的使用1应用解耦2异步处理3流量削峰4日志处理5消息通讯三、使用 MQ 的缺陷1.系统可用性降低:2.系统复杂性变高3.一致性问题四、常用的 MQActiveMQ:RabbitMQ:RocketMQ:Kafka:五、如何保证MQ的高可用?ActiveMQ:RabbitMQ:RocketMQ:Kafka:六、如何保…

stm32——hal库学习笔记(串口<一>)

这里写目录标题 一、数据通信的基础概念&#xff08;了解&#xff09;1.1&#xff0c;串行/并行通信1.2&#xff0c;单工/半双工/全双工通信1.3&#xff0c;同步/异步通信1.4&#xff0c;波特率1.5&#xff0c;常见的串行通信接口 二、串口(RS-232)&#xff08;熟悉&#xff09…

九州金榜|假期即将结束,如何让孩子快速进入学习状态

临近假期结束&#xff0c;很多孩子都还在沉寂在假期之中&#xff0c;很难收心安心学习&#xff0c;也是在这个时候很多家长都会头疼&#xff0c;孩子不收心就会不可避免影响学习&#xff0c;家长对此也是很无奈&#xff0c;下面九州金榜金榜家庭教育给出以下建议&#xff0c;让…

sqlserver 如何设置自增主键?

目录 1.创建表时定义-自增主键2.已存在表定义-自增主键 1.创建表时定义-自增主键 在Microsoft SQL Server中&#xff0c;设置一个自增&#xff08;自动递增&#xff09;的主键可以通过在创建表时定义具有IDENTITY属性的列来实现。以下是创建带有自增主键的新表的示例&#xff…