题目描述
给你一个字符串 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 只包含小写英文字母。
解题思路
分析题目
题目说的很绕,很难理解。读题的实厚需要抓住重点,如任意次操作,字典序最小,同时需要满足距离约束条件。
而距离约束条件是给定的一个值k,我们可以转变问题角度,对每次操作不断更新k,而不是去创建空字符串然后不断判断是否满足k。
观察示例
从案例1中可以发现,有点类似从左往右遍历,对于可以变换成a的位置,就变成a。(因为a的字典序最小)。
再看示例2,对于不能变成a的时候,如这个示例的第三个元素x,只能尽可能降低字典序,将x变成w。
代码实现
两步走:
① 拷贝一个相同的字符串。
② 然后遍历字符串,进行字典序的降低操作。
python
class Solution:
def getSmallestString(self, s: str, k: int) -> str:
ans = list(s)
for i, c in enumerate(map(ord, s)):
tmp = min(c - ord('a'), ord('z') - c + 1)
if k >= tmp:
k -= tmp
ans[i] = 'a'
else:
ans[i] = chr(c - k)
k = 0
return ''.join(ans)
标签:示例,3106,aaaz,aawcd,字符串,操作,Leetcode,20240727,字典
From: https://blog.csdn.net/2301_76443687/article/details/140743502