-
功能:在一个由[’a-z’][‘A-Z’][‘0-1’]组成的字符串中查找字母不重复的最长字串
要求:空间与时间复杂度最低 -
思路:
在题目明确指出字母确定的情况下,一般这个题目会考虑使用位图或者map之类的结构体辅助解题。暴力法的时间复杂度会很高,数据只访问一次是最理想的结果,比较当前找到的字符串长度与最大的长度->cur_len,max_len;采用额外的空间,分别比较list中的字符,或者动态更改list中的字符串,不如直接使用begin,end直接遍历原字符串;剩下如何确认该字符串长度,将当前的索引位置-上次出现的位置 -
代码:
#@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')
- 运行结果:
bcdefa
bc1ade