python - 找到最少的删除次数以获得每个字母的唯一计数

标签 python string algorithm

给出一系列小写字母。我必须找出可以删除的最小数量,以便每个字母表的计数都是唯一的。
我首先做了一个长度为26的数组来计算每个字母表的数量。
然后对数组进行排序。
之后,将第一个元素添加到哈希集中,并从第二个元素开始,如果它的计数是唯一的,则在我将其添加到哈希集中之前,将其添加到哈希集中如果在这之前遇到过,我会从中减去一,直到得到一个以前从未见过的数。


def countUnique(s):
    n=len(s)
    count=[0]*26
    for i in range(n):
        count[(ord(s[i])%97)]+=1

    count.sort()

    deletions=0

    unique=set()
    unique.add(count[0])

    for i in range(1,26):
        if count[i] in unique:
            while count[i] and count[i] in unique:
                count[i]-=1
                deletions+=1
        if count[i]:
            unique.add(count[i])

    return deletions

s='aaabbbccc'

res=countUnique(s)
print(res)    


但是我不能通过测试。我不确定我遗漏了什么或逻辑是否正确任何方向正确的帮助都会受到极大的重视。
例子:
如果字符串是“aaabbbccc”
那么答案应该是3 delete 1 b和delet2c,得到a-3、b-2和c-1的唯一计数。

最佳答案

https://www.geeksforgeeks.org/making-elements-distinct-sorted-array-minimum-increments/修改算法
它通过添加元素使数组中的数字不同。
在我们的例子中,我们希望通过删除字母使每个字母的计数不同。

from collections import Counter

def count_deletions(s):
  " number of deletions to make same number of elements "
  if len(s)  == 0:
    return 0

  cnts = list(Counter(s).values())
  cnts.sort(reverse=True)
  deletes = 0
  for i in range(1, len(cnts)):
      while cnts[i] >= cnts[i-1] and cnts[i] > 0: # only delete while count > 0
        cnts[i] -= 1
        deletes += 1
  return deletes

t = ['aaabbb', 'aaabbbccc', 'aaabbbcccddd', 'abc']
print([(x, count_deletions(x)) for x in t]) # [('aaabbb', 1), ('aaabbbccc', 3), ('aaabbbcccddd', 6), ('abc', 2)]

关于python - 找到最少的删除次数以获得每个字母的唯一计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57933350/

相关文章:

python - 多处理模块中 Pool 对象和 Manager 对象之间的位置

python - 使用 Pandas 删除值中不包含字符串的行

javascript - 查找距复杂多边形中的点设定距离内的区域

python - 使用 SlopeOne 算法预测玩家是否可以完成游戏中的关卡?

algorithm - 边数固定的最短路径

python - 检查 python 中类型的一致方法

python - 将数组转换为 Pandas 数据框列

python - 如何在 numpy 中进行条件行求和?

python - Pyodbc 查询字符串引号转义

java - 如何从字符串中提取值