📌  相关文章
📜  除去K个字符后,按字典顺序在字符串上可能的最大字符串(1)

📅  最后修改于: 2023-12-03 14:58:40.820000             🧑  作者: Mango

除去k个字符后,按字典顺序在字符串上可能的最大字符串

在这道题目中,给定一个字符串以及一个整数k,要求在字符串中去掉至少一个字符,使得剩下的所有字符排列成一个新的字符串,而且新的字符串要按字典顺序尽可能最大。本题考察贪心算法的思想。

思路

对于一个字符串s,如果要求得到字典序最大的字符串,我们可以从左到右遍历字符串,并且在满足字典序最大的情况下尽量不去掉字符。具体做法如下:

  1. 从左到右遍历字符串,找到第一个字符c,比它右边的字符要小。为了保证新字符串尽可能最大,我们需要尽量保留c,因此要将c从字符串中删除。
  2. 从删除c位置往前找到第一个字符x,使得x比c小。如果找不到这样的字符,那么就从字符串的最后一个字符开始往前找,直到找到一个字符y,使得y小于c,并且y右边的所有字符都比c大。我们将字符y删除,并将c插入到y的位置。
  3. 如果要删除的字符数<k,那么重复执行步骤1和2,直到去掉了k个字符为止。
代码

下面是python实现的代码,时间复杂度为O(n*k),其中n为字符串的长度:

def removeKdigits(num: str, k: int) -> str:
    stack = []
    for digit in num:
        while stack and k > 0 and stack[-1] > digit:
            stack.pop()
            k -= 1
        stack.append(digit)

    # 如果要删除的字符数还没有用完,那么从右边弹出字符
    while k > 0:
        stack.pop()
        k -= 1

    # 删除前导零
    while stack and stack[0] == '0':
        stack.pop(0)

    # 如果stack为空,返回0,否则返回新的字符串
    return "".join(stack) if stack else "0"
总结

本题是一道经典的贪心算法题目,通过对题目的分析,我们可以利用栈的数据结构,从左到右遍历字符串,保证去掉的字符最少,同时满足字典序的最大化。这道题目还能够考察到对栈的基本操作,以及如何删除数组中的元素等知识点。