3106.满足距离约束且字典序最小的字符串
【LetMeFly】3106.满足距离约束且字典序最小的字符串:模拟(贪心)
力扣题目链接:https://leetcode.cn/problems/lexicographically-smallest-string-after-operations-with-constraint/
给你一个字符串 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 <= 1000 <= k <= 2000s只包含小写英文字母。
解题方法:贪心
首先需要明确,越靠前的位置越重要。所以要不惜一切代价将前面字符尽可能地变小。
字符变小的方式有两种:
- 往小的方向变。每消耗一次操作次数字符就会变小一点,直到变成了
a为止。 - 往大的方向变。这样做的前提是剩下的操作次数足够让当前字符变大到
z再变成a。
因此贪心思路出来了:
在还剩有操作次数时,从前到后开始变化字符:
对于当前字符,如果剩余操作次数足够往大的方向变到
a,且这样做比往小的方向变到a所需次数更少,则往大的方向变到a为止;否则,往小的方向变,直到变到
a或用完了操作次数为止。
- 时间复杂度$O(len(s))$
- 空间复杂度$O(1)$
AC代码
C++
1 | |
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/140758056
3106.满足距离约束且字典序最小的字符串
https://blog.letmefly.xyz/2024/07/28/LeetCode 3106.满足距离约束且字典序最小的字符串/