字节10-8 糖葫芦

题目描述:
小红想用山楂制作糖葫芦,糖葫芦是一串字符串,比如abc,然后a代表甜味为0,b代表1,c代表2,……(以此类推)。然后要取一段连续的糖葫芦(连续子数组),它的甜味就是所有子数组值之和。请问第k大的糖葫芦甜味是多少?p.s. 糖葫芦如果倒着来和另一串相同的话,算作同一个(不允许存在逆序后相同的连续子串)。如果不存在第k个,就输出-1。

输入输出分为别:输入第一行是n k,第二行是糖葫芦;输出则是第k甜的连续糖葫芦有多甜。

Example
输入:
3 4
abc

输出:
1

输入:
3 4
aba

输出:
0

n大概封顶200

这是字节最后一道笔试题,其实不算难道没法写,(其实字节难得很均匀,都蛮难的,没有特别简单的题),我当时比较慌乱,调了很多次bug(而且居然不允许用本地IDE不然算跳出界面)只过了50%。我当时是图快挣点分就做别的,就直接用双指针+一个数组存现有的子串了,这其实会引起非常多的重复计算。所以后来自己复盘想了一下其实可以用字典树trie代替普通的列表用来争取时间。

代码:

n,k = list(map(int,input().strip().split()))
s = input().strip()

trie = dict()
trie['end'] = False

def find(tree,s):
    if not s:return tree['end']
    if s[0] not in tree:return False
    else:return find(tree[s[0]],s[1:])

def build(tree,s):
    if not s:
        tree['end'] = True
        return
    if s[0] not in tree:
        tree[s[0]] = dict()
        tree[s[0]]['end'] = False
    build(tree[s[0]],s[1:])
      
arr = [ord(x)-ord('a') for x in s]
presum = [0]
for x in arr:presum.append(presum[-1]+x)
n = len(arr)
res = []
for i in range(n):
    for j in range(i+1,n+1):
        if not find(trie,arr[i:j]) and not find(trie,arr[i:j][::-1]):
            build(trie,arr[i:j])
            res.append(presum[j]-presum[i])

res.sort(reverse=True)
if k>len(res):print(-1)
else:print(res[k-1])

时间复杂度大概是O(n^3)吧,双指针就是n^2了,每一次查找了建字典树就是等同于遍历一遍子串本身,所以一共n^3,应该不会超时。

#字节跳动##笔试##我的实习求职记录#
全部评论

相关推荐

找个工作 学历是要卡的 要求是高的 技能不足是真的 实习经验是0的 简历无处可写是事实的 钱不好赚是真的 想躺平又不敢躺 也不甘心躺 怕自己的灵感和才华被掩埋甚至从未被自己发现 又质疑自己是否真正有才华
码农索隆:你现在啊,你心里都明白咋回事,但是你没办法改变现状,一想到未来,你又没有信心狠下心来在当下努力。 得走出这种状态,不能一直困在那里面,哪不行就去提升哪,你一动不动那指定改变不了未来,动起来,积少成多才能越来越好
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务