leetcode3之无重复字符串的最长子串
作者:互联网
题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc",所以其
长度为 3。
示例 2:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
代码如下:
1 def lengthofSubstring(s): 2 ''' 3 返回最长的子字符串的长度 4 :param s: 5 :return: 6 ''' 7 sub_len = [] # 记录子字符串长度 8 for i in range(len(s)): # 循环len(s)次,得到len(s)个子字符串 9 temp_s = [] # 用来存放遍历过的字符 10 count = 0 # 计录子字符串长度 11 # 求每次的子字符串 12 for ch in s[i:]: 13 if ch not in temp_s: 14 temp_s.append(ch) 15 count += 1 16 else: 17 break 18 sub_len.append(count) 19 print("sub_len=", sub_len) 20 21 # if len(sub_len) == 0: 22 # return 0 23 # else: 24 # return max(sub_len) 25 26 return 0 if len(sub_len) == 0 else max(sub_len) 27 28 29 print("-------------测试lengthofSubstring----------") 30 s = "abcabcbb" 31 l = lengthofSubstring(s) 32 print("l=", l) 33 34 35 def lengthOfsubstring(s): 36 length = len(s) 37 max_num, start, end = 0, 0, 0 38 c_cache = set() 39 while start < length and end < length: 40 c = s[end] 41 if c not in c_cache: 42 c_cache.add(c) 43 end += 1 44 max_num = max(max_num, end - start) 45 else: 46 c_cache.remove(s[start]) 47 start += 1 48 return max_num 49 50 51 print("-------------测试lengthofSubstring----------") 52 s = "abcabcbb" 53 l = lengthOfsubstring(s) 54 print("l=", l) 55 56 57 def lengthofsubstring1(s): 58 ''' 59 滑动窗口实现求取最长子字符串 60 :param s: 61 :return: 62 ''' 63 left = 0 64 sub_len = 0 # 记录子字符串的长度 65 max_len = 0 # 记录子字符串的最大长度 66 sub_set = set() # 存储当前子字符串 67 for i in range(len(s)): 68 sub_len += 1 69 while s[i] in sub_set: 70 sub_set.remove(s[left]) 71 left += 1 72 sub_len -= 1 73 if sub_len > max_len: max_len = sub_len 74 75 sub_set.add(s[i]) 76 77 return max_len 78 79 80 print("-------------测试lengthofSubstring----------") 81 s = "abcabcbb" 82 l = lengthofsubstring1(s) 83 print("l=", l)View Code
输出:
-------------测试lengthofSubstring---------- sub_len= [3, 3, 3, 3, 2, 2, 1, 1] l= 3 -------------测试lengthofSubstring---------- l= 3 -------------测试lengthofSubstring---------- l= 3
总结:重点讲解方法1和方法3。方法2是看到网友的解答,顺便也复制过来,没看大明白。
方法1中。总体思想就是以字符串中每个字符作为子串开头,在该子串中找寻最大长度的子串并保存下来,最后比较各子串长度,返回最大数值即为最长字符串。那请问若还要返回最长的子串,该怎么修改代码?如何找寻最大长度子串呢?循环遍历该子串,若该元素已经出现过了,则循环终止,记录下已遍历过元素个数即为子串长度。
方法3中。采用滑动窗口的思想来找寻最长字符串。比如abcabcbb字符串,第一次遍历a进入窗口,第二次b进入窗口,第三次c进入,第四次时因为a已经在窗口了,所以将字符串最左边元素移出,此时窗口子串为bca.继续循环。在循环过程中,记录下每次窗口元素长度sub_len,和max_len进行比较,若大于max_len ,更新。
标签:子串,leetcode3,max,len,字符串,长度,sub 来源: https://www.cnblogs.com/rounie/p/13185052.html