返回
「LeetCode」03-无重复字符的最长子串,乐享编程时光!
前端
2023-10-22 10:20:38
「LeetCode」03-无重复字符的最长子串,一起探索算法世界!
欢迎来到「LeetCode」之旅,我们将在本期挑战中探究一道经典的算法题——03-无重复字符的最长子串。让我们踏上这段充满智慧和乐趣的编程之旅吧!
【问题】
给定一个字符串 s,请你找出其中不含有重复字符的最长子串的长度。
【示例】
示例 1:
输入:s = "abcabcbb"
输出:3
解释:因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入:s = "bbbbb"
输出:1
解释:因为无重复字符的最长子串是 "b",所以其长度为 1。
【题解】
解决本题的关键在于使用滑动窗口算法。该算法通过两个指针来维护一个窗口,窗口内的字符不重复。当遇到重复字符时,窗口右指针向右移动,窗口左指针随之移动以保持窗口内字符不重复。窗口的长度即为无重复字符的最长子串的长度。
【具体步骤】
- 初始化窗口的左指针和右指针,都指向字符串的第一个字符。
- 如果窗口内没有重复字符,则右指针向右移动。
- 如果窗口内出现重复字符,则窗口左指针向右移动,直到窗口内没有重复字符。
- 记录窗口的长度,并与之前的最长子串长度进行比较,更新最长子串长度。
- 重复步骤 2-4,直到窗口右指针到达字符串的末尾。
【代码实现】
def length_of_longest_substring(s):
"""
计算字符串中最长不重复子串的长度。
参数:
s:字符串
返回:
最长不重复子串的长度
"""
# 初始化窗口的左指针和右指针
left, right = 0, 0
# 哈希表用于记录字符是否在窗口内出现过
char_set = set()
# 记录最长子串的长度
max_length = 0
# 遍历字符串
while right < len(s):
# 如果字符不在窗口内,则将其添加到窗口中
if s[right] not in char_set:
char_set.add(s[right])
right += 1
# 如果字符在窗口内,则窗口左指针向右移动,直到窗口内没有重复字符
else:
char_set.remove(s[left])
left += 1
# 更新最长子串的长度
max_length = max(max_length, right - left)
# 返回最长子串的长度
return max_length
【复杂度分析】
- 时间复杂度:O(n),其中 n 是字符串的长度。算法需要遍历字符串一次,因此时间复杂度为 O(n)。
- 空间复杂度:O(n),其中 n 是字符串的长度。算法需要使用哈希表来记录字符是否在窗口内出现过,因此空间复杂度为 O(n)。
【总结】
「LeetCode」03-无重复字符的最长子串是一个经典的算法题,通过滑动窗口算法可以高效地求解。算法的时间复杂度和空间复杂度都是 O(n),其中 n 是字符串的长度。希望大家能够通过本题的讲解,对滑动窗口算法有更深入的理解,并在未来的编程实践中灵活运用。
【欢迎参与讨论】
欢迎大家在评论区留下您的想法和问题,我们共同探讨算法之美!