题目描述:
给你一个字符串 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
输入输出实例:
思路:
计算字符之间的最小距离:字符 ‘a’ 到 ‘z’ 按循环顺序排列,对于两个字符,计算它们之间的最小距离。可以通过 min(abs(ord(s1) - ord(s2)), 26 - abs(ord(s1) - ord(s2)))
来计算。用贪心策略:从左到右遍历字符串 s
,对于每个字符,尝试将其修改为字典序更小的字符(尽量是 ‘a’),直到 distance(s, t) <= k
满足。更新 k
:每次修改字符时,计算修改后增加的距离,更新 k
。
class Solution:
def getSmallestString(self, s: str, k: int) -> str:
def char_dis(s1,s2):
diff = abs(ord(s1)-ord(s2))
return min(diff,26-diff)
n = len(s)
t =list(s)
for i in range(n):
if k <= 0 :
break
distance = char_dis(s[i],'a')
if distance <= k :
t[i] = 'a'
k -= distance
else:
if k > 0:
if ord(s[i])-k > ord('a'):
t[i] = chr(ord(s[i])-k)
else:
t[i] = 'a'
k = 0
break
return ''.join(t)