查找最长不重复子串

  1. 功能:在一个由[’a-z’][‘A-Z’][‘0-1’]组成的字符串中查找字母不重复的最长字串
    要求:空间与时间复杂度最低

  2. 思路:
    在题目明确指出字母确定的情况下,一般这个题目会考虑使用位图或者map之类的结构体辅助解题。暴力法的时间复杂度会很高,数据只访问一次是最理想的结果,比较当前找到的字符串长度与最大的长度->cur_len,max_len;采用额外的空间,分别比较list中的字符,或者动态更改list中的字符串,不如直接使用begin,end直接遍历原字符串;剩下如何确认该字符串长度,将当前的索引位置-上次出现的位置

  3. 代码:

#@author tangjin
#@date 2018-09-21
import string
#思想:1.以dictionry键值对存储的方式存储字母在整个字符串中的位置;
#2.以字母当前的位置减去上一次出现的位置获得基于该字母最大长度;
#3.以end begin存储最长字串出现的起始与结束位置

def lengthOflongsubstring(s):
    begin = 0 #最长字串开始下标
    end = 0 #最长字串结束下表
    cur_len = 0 #当前字串长度
    pre_loc = -1 #该字符的上一个位置,python数组从0开始计算
    max_len = 0 #最长字串的长度

    #ele_loc_dict初始化,将所有的值都赋值为-1
    letter_list = string.ascii_letters
    number_list = string.digits
    ele_loc_dict={}
    for i in range(len(letter_list)):
        ele_loc_dict[letter_list[i]] = -1
    for i in range(len(number_list)):
        ele_loc_dict[number_list[i]] = -1

    for index in range(len(s)):
        if pre_loc < ele_loc_dict[s[index]]:
            pre_loc = ele_loc_dict[s[index]]
        # 当前索引-之前位置,得到根据该字母获得的子串长度
        cur_len = index-pre_loc
        if max_len<=cur_len:
            begin=pre_loc+1
            end=index
            max_len = cur_len
        #更新必须放在最后一步,将字母对应的loaction更新
        ele_loc_dict[s[index]]=index
    print(s[begin:(end+1)])

lengthOflongsubstring('abcdefa')
lengthOflongsubstring('abc1ade1fa13')
  1. 运行结果:
bcdefa
bc1ade
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值