【编程练习】第K小子串

题目来源:牛客,腾讯2021校园招聘技术类编程题汇总 第2题

题目描述:

在这里插入图片描述

题解:

法一:个人解法

✨利用python中的set+list.sort(),感jio有点无耻。
💡唯一一点想法是:第k小的子串的长度必然小于等于k,因此,只需要将字符串s中长度小于等于k的所有子串拿出来并排序即可。
⚠️注意,由于子串可能会重复,因此借助了set去重。
🔥再注意,之前的一个错误想法是:当subs中存储的子串数量大于k时就可以停止收集子串,但这种想法是错的,因为前k小的子串可能出现在很后面。

def main():
    s = input()
    k = int(input())
    lens = len(s)
    subs = set()
    for i in range(lens):
        for j in range(1,k+1):
            subs.add(s[i:min(i+j,lens)])
    subs = list(subs)
    subs.sort()
    print(subs[k-1])
    return

if __name__=='__main__':
    main()
法二:别人的解法–k路归并

自己最开始就是这样想的,但写着写着发现,直接sort就ok,何必归并,就放弃了。

小知识总结

🌛 集合set的初始化及元素添加:s=set();s.add(a);
🌞 字符串的排序:s.sort(),注意,这个排序是对s本身进行操作,无返回值;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值