LeetCode: 03_longest-substring-without-repeating-characters
问题描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
暴力答案:
从多到少,判断所有字符是否有重复出现。
计算时间太长,有待改进。
1 class Solution(object): 2 def lengthOfLongestSubstring(self, s): 3 n=len(s) 4 if n==0:#排除出现空的字符串 5 return 0 6 exit(0) 7 for i in range(n,0,-1):#为了寻找最大值,所以倒叙排列,字符的个数 8 for j in range(0,n+1-i):#每种字符数下,所有连续字符串 9 string=s[j:j+i] 10 r=''.join(x for i,x in enumerate(string) if string.index(x)==i)
#列表推导式,判断下标与字符是否相同,如果有重复就会有差异
#index只会返回第一次出现的下标
##''.join合并字符串
11 if r==string: 12 return len(string) 13 exit(0)程序直接退出
参考答案
滑动窗口
1 =utf-8 2 class Solution: 3 def lengthOfLongestSubstring(self, s): 4 length = l = r = 0 5 while r<len(s): 6 if s[r] not in s[l:r]: 7 print r,s[r],s[l:r]#同一行输出 8 r += 1 9 length = max(length, r-l)#最大长度就是右标与左标的差别,与之前出现的最大长度进行比较 10 print r,length 11 else: 12 l += 1 #出现重复字符以后,作左指针开始往右移动,直到过了重复出现的字符 13 return length #返回最长度 14 15 16 17 ss="hingnkl" 18 a=Solution().lengthOfLongestSubstring(ss)#正确的调用方式 19 print a 20 21 #思路演绎 22 print(len(ss[0:0]))#ss[0,0]表示长度为0 的字符串 23 ''' 24 len=7 25 r l s[r] s[l:r] length 26 r=0 l=0 s[r]=h s[l:r]=[] length=1 27 r=1 l=0 s[r]=i s[l:r]=h length=2 28 r=2 l=0 s[r]=n s[l:r]=hi length=3 29 r=3 l=0 s[r]=g s[l:r]=hin length=4 第一次出现最大值 30 r=4 l=0 s[r]=n in s[l:r]=hing 31 r=4 l=1 s[r]=n in s[l:r]=ing 32 r=4 l=2 s[r]=n in s[l:r]=ng 33 r=4 l=3 s[r]=n s[l:r]=g length=4 开始第二次移位,从重复字符的下一个字符开始 34 r=5 l=3 s[r]=k s[l:r]=gn length=4 35 r=6 l=3 s[r]=l s[l:r]=gnk length=4 所有的字符判断完成,循环结束 36 37 '''