牛客编程巅峰赛S2第6场 - 青铜&白银&黄金
求各位大神帮忙看看代码错在哪里!
第二题求找问题,只能通过9%案例,不知道自己的代码错在哪里。😣
题目:
链接:https://ac.nowcoder.com/acm/contest/9715/B
来源:牛客网
来源:牛客网
给出一个仅包含小写字母的字符串s,你最多可以操作k次,使得任意一个小写字母变为与其相邻的小写字母(ASCII码差值的绝对值为1),请你求出可能的最长相等子序列(即求这个字符串修改至多k次后的的一个最长子序列,且需要保证这个子序列中每个字母相等)。
子序列:从原字符串中取任意多个字母按照先后顺序构成的新的字符串
输入2 “abcde" 输出3
输入10 "acesxd" 输出4
本人代码:
class Solution:
def string2(self , k , s ):
// 统计a到z的次数
res = {}
for i in range(97, 123):
res[i] = 0
for unit in s:
res[ord(unit)] = res.get(unit, 0) + 1
// 定义计数函数,dic:存储次数的字典,k:题目给的参数k,num:将其他字母转成num所能构成的最长子序列长度
def countNum(dic, k, num):
countt = dic[num]
dis = 1
while k >= 0:
num_min = num - dis
num_max = num + dis
if num_min >=97:
if k >= dic[num_min] * dis:
countt += dic[num_min]
k -= dic[num_min] * dis
else:
countt += k // dis
k -= dic[num_min] * dis
if num_max <= 122:
if k >= dic[num_max] * dis:
countt += dic[num_max]
k -= dic[num_max] * dis
else:
countt += k // dis
k -= dic[num_max] * dis
dis += 1
if num_max>=123 and num_min<=96:
return countt
return countt
// 从a到z遍历 寻找最长的子序列
result = 0
for i in range(97, 123):
result = max(result, countNum(res, k, i))
return result