📌  相关文章
📜  字典序最小的字符串可以通过对给定的字符串进行ķ操作(1)

📅  最后修改于: 2023-12-03 15:09:20.984000             🧑  作者: Mango

题目

给定一个字符串s和一个正整数k,找到可以通过k次操作得到的字典序最小的字符串。

每个操作可以将字符串s中的一个字符替换为该字符的前一个字母或后一个字母。操作后得到的字符串需要与之前的字符串相同长度。

思路

该题目可以通过贪心算法解决。

  1. 首先,我们可以遍历字符串s,对于每个位置i,我们找到[right[i]-'a', 'z']区间内的最小值和[left[i]-'a', 'z']区间内的最小值。

  2. 然后,我们可以用这两个最小值来更新当前位置i的值,这样可以使得字典序最小。

  3. 如果k>0,我们可以通过比较当前字符和更新后的字符来确定是否需要进行操作,如果要进行操作,则将k减1,更新当前位置i的值。

  4. 最后返回更新后的字符串s。

代码实现
def min_lex_str(s, k):
    left = [-1] * len(s)
    right = [-1] * len(s)

    for i in range(len(s)):
        left[i] = ord(s[i]) - ord('a')
        right[i] = ord('z') - ord(s[i])

    for i in range(len(s)):
        if k == 0:
            break

        if left[i] >= right[i]:
            if k >= right[i]:
                k -= right[i]
                s = s[:i] + 'a' + s[i+1:]
            else:
                s = s[:i] + chr(ord(s[i]) + k) + s[i+1:]
                k = 0
        else:
            if k >= left[i]:
                k -= left[i]
                s = s[:i] + 'a' + s[i+1:]
            else:
                s = s[:i] + chr(ord(s[i]) - k) + s[i+1:]
                k = 0

    return s
复杂度分析

时间复杂度:O(n),其中n为字符串s的长度,因为需要遍历整个字符串s。

空间复杂度:O(n),需要两个数组left和right分别存储从左端点和右端点开始的区间最小值。