声明:
今天是中等题第2道题。给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc",所以其长度为 3。示例 2:
输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是"b",所以其长度为 1。示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"是一个子序列,不是子串。
解法1。首先第一想到的是暴力法,就是穷举所有可能性,并在每一步都选择是否要更新最大长度,但这种做法时间复杂度高,为,所以选择用滑动窗口的方法,基本思路就是固定下i,j逐渐往后走,长度更新为j-i,直到遇到重复的元素,删掉第i个元素(这个元素就是重复的),然后i+1,j继续往后走,该方法时间复杂度为代码如下。
执行用时: 136 ms, 在Longest Substring Without Repeating Characters的Python3提交中击败了58.50% 的用户
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
if not s:
return None
i,j = 0,0
len_s = len(s)
string = set()
max_len = 0
while i < len_s and j < len(s):
if s[j] not in string:
string.add(s[j])
j += 1
max_len = max(max_len,j-i)
else:
string.remove(s[i])
i += 1
return max_len
解法2。上一种解法的优化思路,主要区别是存储最长字符串的容器由集合set改为字典dict,并且在j移动过程中不删除元素,只更新i值,并用j-i+1作为当前的子串长度和上一轮最长长度相比较来更新最长长度,代码如下。
执行用时: 144 ms, 在Longest Substring Without Repeating Characters的Python3提交中击败了51.59% 的用户
class Solution:
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
i,j = 0,0
string = {}
len_s = len(s)
max_len = 0
while i < len_s and j < len_s:
if s[j] in string:
i = max(string.get(s[j],0),i)
max_len = max(max_len, j-i+1)
string[s[j]] = j+1
j += 1
return max_len
结尾
解法1&解法2:官方解法