目标
给你一个仅由数字组成的字符串 s,在最多交换一次 相邻 且具有相同 奇偶性 的数字后,返回可以得到的 字典序 最小的字符串。
如果两个数字都是奇数或都是偶数,则它们具有相同的奇偶性。例如,5 和 9、2 和 4 奇偶性相同,而 6 和 9 奇偶性不同。
示例 1:
输入: s = "45320"
输出: "43520"
解释:
s[1] == '5' 和 s[2] == '3' 都具有相同的奇偶性,交换它们可以得到字典序最小的字符串。
示例 2:
输入: s = "001"
输出: "001"
解释:
无需进行交换,因为 s 已经是字典序最小的。
说明:
- 2 <= s.length <= 100
- s 仅由数字组成。
思路
有一个仅由数字组成的字符串 s
,最多可以执行一次操作,交换字符串中相邻并且奇偶性相同的元素,返回可以得到的字典序最小的字符串。
实际上就是交换第一个满足 i < j && s.charAt(i) - '0' > s.charAt(j) - '0 && (s.charAt(i) - '0') % 2 == (s.charAt(j) - '0') % 2
的相邻字符。
注意到 0
的 ASCII码为 48
,数字的 ASCII码的奇偶性与数字本身的奇偶性相同,并且数字大的对应的 ASCII 码也大,不影响判断,可以不用减字符 '0'。
代码
/**
* @date 2024-10-30 0:11
*/
public class GetSmallestString3216 {
public String getSmallestString(String s) {
char[] chars = s.toCharArray();
int n = s.length();
int prev = s.charAt(0);
for (int i = 1; i < n; i++) {
int cur = s.charAt(i);
if (prev > cur && prev % 2 == cur % 2) {
chars[i] = s.charAt(i - 1);
chars[i - 1] = s.charAt(i);
break;
}
prev = cur;
}
return new String(chars);
}
}