竞赛讨论区 > 牛客编程巅峰赛S2第6场 - 青铜&白银&黄金
头像
DoubleRong
发布于 2020-12-04 21:44
+ 关注

牛客编程巅峰赛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 



全部评论

(1) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐