Python算法题集_无重复字符的最长子串

本文为Python算法题集之一的代码示例

题目3:无重复字符的最长子串

说明:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

- 感慨:本题很特殊,特别特殊,超级无敌特殊!!!

程序员没有一个没写过字符串处理,没有一个没写过查找字符串子串

问题是谁都能写,可是写出来就是原形毕露,稍不留神,就要贻笑大方

大虾们是高手,十年练剑,深藏不露,都是传说中十步杀一人,千里不留行的人物

如果本文写得笨拙浅薄,还请大虾们多多包涵,高抬贵手~~


本题求解有两个重点工作

一是在子串中进行字符查重

可以使用基本查重【集合中查询子元素】、字典查重【哈希值,值为数字】、下标查重【ord(char)为下标,数组元素为数字】

二是对字符串进行遍历找出所有子串

可使用双重循环、单循环单指针、双指针【滑动窗口】


注意:代码运行每次速度都不同,估计服务器负载有波动

注意:代码运行每次速度都不同,估计服务器负载有波动

注意:代码运行每次速度都不同,估计服务器负载有波动


  1. 新手基本型【基本查重+双重循环】,无脑遍历,注定超时

    ​ 用双重循环遍历所有子串,字符查重则可以采用集合set去重查重或者字符串查子串函数查重。此算法颇为无脑,算是初学程序者的作品,肯定会超时,就不给它表现的机会了

    def longest_unique_substr_newbie(s):  # 双循环遍历、集合查重
        iLen=len(s)
        iMaxsublen=0
        for iIdx in range(iLen):
            for iJdx in range(iIdx+1, iLen-1):
                if len(set(s[iIdx:iJdx])) == iJdx-iIdx:
                    iMaxsublen = max(iMaxsublen, iJdx-iIdx)
        return iMaxsublen
    
    print(longest_unique_substr_newbie('abcabcbb'))
    # 运行结果 
    3
    

  1. 下标查重+双重循环,有所改善,超过77%
    在这里插入图片描述

    def longest_unique_substr_ext1(s):  # 下标查重+双重循环
        iLen = len(s)
        iMaxsublen = 0
        icharcount = [0] * 128
        ileft, iright = 0, 0
        while iright < iLen:
            icharcount[ord(s[iright])] += 1
            while icharcount[ord(s[iright])] 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长孤秋落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值