爱奇异-字符串价值
题目描述
有一种有趣的字符串价值计算方式:统计字符串中每种字符出现的次数,然后求所有字符次数的平方和作为字符串的价值
例如: 字符串"abacaba",里面包括4个'a',2个'b',1个'c',于是这个字符串的价值为4 * 4 + 2 * 2 + 1 * 1 = 21
牛牛有一个字符串s,并且允许你从s中移除最多k个字符,你的目标是让得到的字符串的价值最小。
例如: 字符串"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
输出
复制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
浙公网安备 33010602011771号