题目描述
给定一个字符串s,最多只能进行一次变换,返回变换后能得到的最小字符串(按照字典序进行比较)。
变换规则:交换字符串中任意两个不同位置的字符。
输入描述
一串小写字母组成的字符串s
备注
s是都是小写字符组成
1<=s.length<=1000
输出描述
一串小写字母组成的字符串s
示例1
输入
abcdef
输出
abcdef
说明
abcdef已经是最小字符串,不需要交换。
示例2
输入
bcdefa
输出
acdefb
说明
a和b进行位置交换,可以得到最小字符串。
解题思路
题目要求给定一个字符串s
,通过最多进行一次字符交换,找到能够得到的按字典序排序最小的字符串。
题目的关键点:
- 只能进行一次变换(交换两个不同位置的字符),或者不变换。
- 目标是找到最小的可能字符串,即字典序最小。
- 字典序是按照字母顺序进行排列的顺序,例如
"abc"
<"acb"
。在字典序中,前面的字符越小,整个字符串的字典序就越小。
思路分析:
- 首先,我们需要检查字符串当前是否已经是字典序最小的(即字符串已经是按字典序排好序的)。如果是,那么直接输出原字符串即可。
- 如果不是,我们需要找到如何通过交换两个字符使字符串变得更小。
代码解释
代码使用了贪心算法的思想。
核心在于:
-
逐字符比较:从字符串的最左边开始,逐字符比较原字符串与排序后的字符串,寻找第一个不匹配的字符。确保此位置的字符是尽可能的最小值。
-
如果存在多个字典序最小的字符,则选择尽可能靠后的。
最小化的关键:
代码接下来通过逐字符比较原字符串和排序后的字符串:
- 当找到第一个不同的字符时,例如在
"dcab"
中,原字符串的第一个字符'd'
与排序后字符串的第一个字符'a'
不同。 - 这个差异表明,如果将原字符串中的
'd'
换成'a'
,字典序会变得更小。
为什么第一次交换就足够(贪心):
当我们找到第一个不同字符并进行交换后:
- 我们确保了字符串的第一个字符已经是可能的最小字符。
- 由于字典序的排列原则,最左边的字符影响最大。只要第一个字符已经是最小的,接下来的字符顺序无需再调整,因为再调整也不会得到更小的字典序。
示例
假设输入字符串是 "bcaac