给出一系列小写字母。我必须找出可以删除的最小数量,以便每个字母表的计数都是唯一的。
我首先做了一个长度为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/