华为OD机试E卷 - 字符串变换最小字符串(Java & Python& JS & C++ & C )

题目描述

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

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

输入描述

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

备注

s是都是小写字符组成

1<=s.length<=1000

输出描述

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

示例1

输入

abcdef

输出

abcdef

说明

abcdef已经是最小字符串,不需要交换。

示例2

输入

bcdefa

输出

acdefb

说明

a和b进行位置交换,可以得到最小字符串。

解题思路

题目要求给定一个字符串s,通过最多进行一次字符交换,找到能够得到的按字典序排序最小的字符串。

题目的关键点:

  1. 只能进行一次变换(交换两个不同位置的字符),或者不变换。
  2. 目标是找到最小的可能字符串,即字典序最小。
  3. 字典序是按照字母顺序进行排列的顺序,例如"abc" < "acb"。在字典序中,前面的字符越小,整个字符串的字典序就越小。

思路分析:

  1. 首先,我们需要检查字符串当前是否已经是字典序最小的(即字符串已经是按字典序排好序的)。如果是,那么直接输出原字符串即可。
  2. 如果不是,我们需要找到如何通过交换两个字符使字符串变得更小。

代码解释

代码使用了贪心算法的思想。

核心在于:

  1. 逐字符比较:从字符串的最左边开始,逐字符比较原字符串与排序后的字符串,寻找第一个不匹配的字符。确保此位置的字符是尽可能的最小值。

  2. 如果存在多个字典序最小的字符,则选择尽可能靠后的。

最小化的关键:

代码接下来通过逐字符比较原字符串和排序后的字符串:

  • 当找到第一个不同的字符时,例如在"dcab"中,原字符串的第一个字符'd'与排序后字符串的第一个字符'a'不同。
  • 这个差异表明,如果将原字符串中的'd'换成'a',字典序会变得更小。

为什么第一次交换就足够(贪心):
当我们找到第一个不同字符并进行交换后:

  • 我们确保了字符串的第一个字符已经是可能的最小字符。
  • 由于字典序的排列原则,最左边的字符影响最大。只要第一个字符已经是最小的,接下来的字符顺序无需再调整,因为再调整也不会得到更小的字典序。

示例

假设输入字符串是 "bcaac

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值