📌  相关文章
📜  字典上最小的字符串,它在恰好 K 个索引处与给定的字符串不同(1)

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

查询字典上最小的不同字符串

要求:找出一个字典中最小的字符串,使得它在恰好 K 个索引处与给定的字符串不同。

输入格式

给定一个字符串 S,以及一个正整数 K。(1 <= K <= len(S) <= 5000)

输出格式

输出字典顺序最小的字符串,如果不存在这样的字符串,返回 -1。

样例输入
S = "leetcode"
K = 3
样例输出
"aaagffff"
解释

在 leetcode 这个字符串中,与它恰好在 3 个索引处不同的最小字符串为 "aaagffff"。

思路分析

首先,字典顺序最小的字符串一定要尽可能多的使用字典序靠前的字符,即尽可能多地使用 'a'。

其次,对于 K 个位置不同的字符串,我们可以先将其全部替换成 'a',然后从右往左遍历字符串,找到第一个字符能替换的位置,将该位置字符减一,然后将该位置之后的字符全部替换成 'a'。

代码实现
def get_min_string(S: str, K: int) -> str:
    s_list = list(S)
    for i in range(len(s_list)):
        if K == 0:
            break
        if s_list[i] != 'a':
            s_list[i] = 'a'
            K -= 1
    if K == 0:
        return ''.join(s_list)
    for i in range(len(s_list) - 1, -1, -1):
        if K == 0:
            break
        if s_list[i] != 'a':
            s_list[i] = chr(ord(s_list[i]) - 1)
            K -= 1
    if K > 0:
        return "-1"
    j = len(s_list) - 1
    while j >= 0 and s_list[j] == 'a':
        j -= 1
    if j >= 0:
        s_list[j] = chr(ord(s_list[j]) - 1)
        j += 1
        while j < len(s_list):
            s_list[j] = 'a'
            j += 1
    return ''.join(s_list)
复杂度分析
  • 时间复杂度:$O(n)$, n 为字符串的长度。
  • 空间复杂度:$O(n)$,我们需要将字符串转换为列表。