前言
经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。后续开始专项练习。
描述
给你一个字符串
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
。示例 1:
输入:s = "zbbz", k = 3 输出:"aaaz" 解释:在这个例子中,可以执行以下操作: 将 s[0] 改为 'a' ,s 变为 "abbz" 。 将 s[1] 改为 'a' ,s 变为 "aabz" 。 将 s[2] 改为 'a' ,s 变为 "aaaz" 。 "zbbz" 和 "aaaz" 之间的距离等于 k = 3 。 可以证明 "aaaz" 是在任意次操作后能够得到的字典序最小的字符串。 因此,答案是 "aaaz" 。示例 2:
输入:s = "xaxcd", k = 4 输出:"aawcd" 解释:在这个例子中,可以执行以下操作: 将 s[0] 改为 'a' ,s 变为 "aaxcd" 。 将 s[2] 改为 'w' ,s 变为 "aawcd" 。 "xaxcd" 和 "aawcd" 之间的距离等于 k = 4 。 可以证明 "aawcd" 是在任意次操作后能够得到的字典序最小的字符串。 因此,答案是 "aawcd" 。示例 3:
输入:s = "lol", k = 0 输出:"lol" 解释:在这个例子中,k = 0,更改任何字符都会使得距离大于 0 。 因此,答案是 "lol" 。提示:
1 <= s.length <= 100
0 <= k <= 2000
s
只包含小写英文字母。
实现原理与步骤
1.根据题干意思就是字符到'a'的距离小于k就替换为a,距离不够时移动到a最近的位置。
题干意思转换后思考应用的数据结构和算法时什么?
贪心+数组最为合适。
2. 一个字母移动到a的最短距离为Math.min(c-'a','z'-c+1);
3. 替换字母情况下将原字符串转换为字符数组,避免后续不必要的转换操作。
4. 字符串数组转换为字符串new String(ans);
代码实现
class Solution {public String getSmallestString(String s, int k) {char[] ans=s.toCharArray();for(int i=0;i<ans.length;i++){int distance=Math.min(ans[i]-'a','z'-ans[i]+1);if(distance<=k){ans[i]='a';k-=distance;}else{ans[i]-=k;break;}}return new String(ans);}
}