[LintCode 384] 最长无重复字符的子串(Python)

题目描述

给定一个字符串,请找出其中无重复字符的最长子字符串。

样例
例如,在”abcabcbb”中,其无重复字符的最长子字符串是”abc”,其长度为 3。
对于,”bbbbb”,其无重复字符的最长子字符串为”b”,长度为1。

思路

遍历字符串中的每一个元素。借助一个辅助键值对来存储某个元素最后一次出现的下标。用一个整形变量存储当前无重复字符的子串开始的下标。

def longest_substring(str):
    if str == None or len(str)==0:
        return 0
    maxlen = 0 #最大的字串长度
    position = {}#保存非重复字符最后的位置
    start = 0#保存非重复字串开始的位置
    for i in range(len(str)):
        if (str[i] in position) and (position[str[i]] >= start) :
            start = position[str[i]] +1
            position[str[i]] = i
        position[str[i]] = i
        current_len = i-start+1 #当前非重复字串的长度
        maxlen = max(maxlen, current_len)
    return maxlen

if __name__ == '__main__':
    print 'longest substring:'
    str = 'abcabcbb'
    print longest_substring(str)

时间复杂度 O(n) O ( n ) , 空间复杂度 O(n) O ( n )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值