题目
给你一个字符串 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);
}
}