3216.交换后字典序最小的字符串

目标

给你一个仅由数字组成的字符串 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);
    }

}

性能

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注