LeetCode. 3106. 满足距离约束且字典序最小的字符串

68 阅读1分钟

题目

leetcode.cn/problems/le…

给你一个字符串 s 和一个整数 k 。

定义函数 distance(s1, s2) ,用于衡量两个长度为 n 的字符串 s1 和 s2 之间的距离,即:

  • 字符 'a' 到 'z' 按 循环 顺序排列,对于区间 [0, n - 1] 中的 i ,计算所有「 s1[i] 和 s2[i] 之间 最小距离」的 

例如,distance("ab", "cd") == 4 ,且 distance("a", "z") == 1 。

你可以对字符串 s 执行 任意次 操作。在每次操作中,可以将 s 中的一个字母 改变任意 其他小写英文字母。

返回一个字符串,表示在执行一些操作后你可以得到的 字典序最小 的字符串 t ,且满足 distance(s, t) <= k 。

思路

需要求出字典序最小的字符串并且与原字符串的差值≤K;

贪心:因为需要变成字典序最小的,最小结果为 a ,分别判断字符左右两侧到 a 的距离,取最小的一侧,然后更新 k 的值; 如果不能更新成 a 则向下减小;

代码

class Solution {
    public String getSmallestString(String s, int k) {
        int n = s.length();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            char c = s.charAt(i);
            if (k == 0) {
                sb.append(c);
                continue;
            }
           int sub =  Math.min(c - 'a', 'z' - c + 'a');
            if (sub <= k) {
                k -= sub;
                sb.append("a");
            }else{
                sb.append((char) (c - k));
                k = 0;
            }
        }
        return new String(sb);
    }
}

题解

leetcode.cn/problems/le…