一、题目描述

给定一个长度为n的小写字符数组,一次操作是删除一个最小字母,如有多个删除最靠左的。要求输出操作k次后的字符串。

输入:abcdabcd   k = 3
输出:cdbcd 

二、解题思路 & 代码

由于都是小写字母,字符类型比较简单,故而可以用简便的方法

  1. 采用哈希表将字符串进行计数
  2. 将键值从小到大排序,而后从前往后删除,当删除的数量 == k 时停止
from collections import Counter

def delMinAlpha(s, k):
    n = len(s)
    dic = Counter(s)
    print("dic:", dic)
    sum_ = 0
    del_dic = {
   }
    key_list = sorted(list(dic.keys()))
    print("key_list:", key_list)
    for stop_ind, key in enumerate(key_list):
        sum_ = sum_ + dic[key]
        del_dic[key] = dic[key]
        if sum_ >= k:
            break
    print("ind:", stop_ind)
    print("sum_:", sum_)

    stop_key = key_list[stop_ind]
    print("stop_key:", stop_key)

    del_dic[stop_key] = dic[stop_key] - (sum_ - k)
    print("del_dic:", del_dic)
    new_list = ''
    for j in range(n):
        if s[j] not in del_dic:                      # 要删除的键值 不存在
            new_list += s[j]
        elif s[j] in del_dic and del_dic[s[j]] > 0:  # 要删除的键值 存在,且还没删光
            del_dic[s[j]] -= 1
            continue
        elif s[j] in del_dic and del_dic[s[j]] <= 0:  # 即使要删除的键值 存在,但是已经删光了
            new_list += s[j]
    return new_list

if __name__ == '__main__':
    # ASCII_num = ord('a') # 返回 ASCII 码
    s = 'abcdabcdabcdabcd'
    k = 14
    res = delMinAlpha(s, k)
    print("res:", res)