Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb", the answer is "abc", which the length is 3.
Given "bbbbb", the answer is "b", with the length of 1.
Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
一句话计算最大连续不重复子串长度
自己在写的时候一头扎进了设计规则里面,想排除各种重复的位置,各种可能,试了一次又一次之后发现,找出全部可能不现实。
看了讨论区
def lengthOfLongestSubstring(self, s):
#maxlen保存目前已检测序列中最大不重复子串的长度
#start保存距离当前字符最近的不重复子串的起始位置
#dic保存每个字符最后一次出现的位置
dic, maxlen,start={},0,0
for i,ch in enumerate(s):
#当前字符曾经出现过
if ch in dic:
#比较当前不重复子串长度i-start 和历史最大不重复子串长度maxlen,选择大的更新
maxlen = max(maxlen, i-start)
#从ch上次出现之后开始dic[ch]+1 或者 从距离当前不重复子串的起始位置开始(aabaccba,扫描道最后一个a时,start=5,dic['a']=3,要避免从dic['a']+1到start 之间的重复字符),选择距离当前字符最近的更新
start = max(start, dic[ch]+1)
#没出现过的字符直接加字典
dic[ch] = i
#循环里没有处理最后一个字符和前面不重复的情况(aaaabcd),最后要计算一下
return max(maxlen,len(s)-start)
里面有一个函数numerate(),这个函数是内置函数(博客讲解)
很优雅的处理list,字符串这种不带index的可遍历对象,
enumerate将字符串组成一个索引序列,利用它可以同时获得索引和值,输出结果类似于pandas.Series格式
list1 = ["这", "是", "一个", "测试"]
#普通写法
for i in range (len(list1)):
print i ,list1[i]
#优雅升级版
#第二个参数用于指定索引起始值
for index, item in enumerate(list1,1):
print index, item
>>>
1 是
2 一个
3 测试
#大神说做文本统计的话会更快
count = 0
for index, line in enumerate(open(filepath,'r')):
count += 1
#文本很大,这种可能会死机
count = len(open(filepath, 'r').readlines())
还看到一个大体想法差不多的解法
class Solution:
# @return an integer
def lengthOfLongestSubstring(self, s):
dic,start,maxlen={},0,0
for i in range(len(s)):
if s[i] in dic and start<=dic[s[i]]+1:
start= dic[s[i]]+1
else:
maxlen=max(maxlen,i-start+1)
dic[s[i]]=i
return maxlen
用enumerate实现第二种方法时间是99ms,加一个前面的数据判断
if len(s) == 0:
return 0
elif len(s) == 1:
return 1
直接提升20ms到79ms,可怕
网友评论