本人算法萌新,为秋招找工作开始磨炼算法,如果我有哪些地方做的有问题的,还请大家不吝赐教.
1.题干
给你一个字符串
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" 。
2.思考
题目要求我们通过有限的次数(k次)将给定的字符串 s
转换为尽可能小的字符串。这里的“小”指的是字典序上的最小。
变换规则:
字符是 'a':如果当前字符已经是 'a',则无需变化,直接将其添加到结果字符串中,并继续处理下一个字符。
字符不是 'a':计算当前字符到 'a' 的最近距离。有两种情况:
能一步到位:如果当前字符到 'a' 的距离小于或等于 k,那么可以直接将字符变为 'a',并将 k 减去这个距离。
不能一步到位:如果当前字符到 'a' 的距离大于 k,那么只能将字符减少 k 步,k 变为 0。
最后所得结果即为解.
3.代码
class Solution:
def getSmallestString(self, s: str, k: int) -> str:
result = ''
for i in range(len(s)):
if k == 0:
result += s[i]
continue
if s[i] == 'a':
result += 'a'
continue
else:
# 该字符到a的距离 从左或从右的最小值
distance = min(ord('a') + 26 - ord(s[i]), ord(s[i]) - ord('a'))
# 如果k步能变化到
if distance <= k:
result += 'a'
k -= distance
# 如果k步变化不到
else:
result += chr(ord(s[i]) - k)
k = 0
return result
if __name__ == "__main__":
solution = Solution()
s = "xaxcd"
k = 4
print(solution.getSmallestString(s, k))
4.总结
这道题主要的难点在于理解题目的意思,直到题目让我们干什么,其次是取向左走或者向右走的最小值,就比如z是向右走到a,b是向走走到a,其他的就是一些细节.