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 ,更新。

扫描二维码关注公众号,回复: 11352723 查看本文章

猜你喜欢

转载自www.cnblogs.com/rounie/p/13185052.html