王老头

导航

爱奇异-字符串价值

题目描述

有一种有趣的字符串价值计算方式:统计字符串中每种字符出现的次数,然后求所有字符次数的平方和作为字符串的价值
例如: 字符串"abacaba",里面包括4个'a',2个'b',1个'c',于是这个字符串的价值为4 * 4 + 2 * 2 + 1 * 1 = 21
牛牛有一个字符串s,并且允许你从s中移除最多k个字符,你的目标是让得到的字符串的价值最小。

输入描述:

输入包括两行,第一行一个字符串s,字符串s的长度length(1 ≤ length ≤ 50),其中只包含小写字母('a'-'z')。
第二行包含一个整数k(0 ≤ k ≤ length),即允许移除的字符个数。

输出描述:

输出一个整数,表示得到的最小价值。

示例1

输入

复制
aba
1

输出

复制
2

主要思路:先用一个字典保存每个字符对应的个数,然后将字典中的value组成一个列表,根据输入的k求得最后删减后的列表,最后求最后列表的字符串价值。
这里的一个误区:一开始以为对value的列表排序后从大到小直接逐个减就行,结果是错误的。
其关键在于每次对列表减完一个值后必须重新对列表进行排序,这样才能导致最后的字符串价值最小。
python  code:
def getCount(strs):
    clist = {}
    lstr = list(strs)
    for i in range(len(lstr)):
        if lstr[i] not in clist:
            count = strs.count(lstr[i])
            temp = str(lstr[i])
            clist[temp] = count

    return clist

def getVlist(clist,k):
    vlist = []
    for v in clist.values():
        vlist.append(v)
    for i in range(k):
        vlist = sorted(vlist,reverse=True)
        # print(vlist)
        vlist[0]-=1
    return vlist

def getValue(vlist):
    value = 0
    for i in vlist:
        value+=i*i
    return value

while True:
    try:
        strs = raw_input()
        k = int(raw_input())
        clist = getCount(strs)
        vlist = getVlist(clist,k)
        value = getValue(vlist)
        print(value)
        
    except Exception as e:
        break

 

posted on 2019-04-24 11:00  王老头  阅读(187)  评论(0)    收藏  举报