返回
力克重复,创造极长子串:探索无重复字符子串的奥秘
前端
2023-11-11 10:45:19
在计算机科学领域,字符串处理是不可或缺的组成部分。LeetCode题库中的“无重复字符的最长子串”问题便是字符串处理的经典代表,备受程序员们的关注和喜爱。该问题不仅考察了算法的基础知识,也考验了对数据结构的应用能力。
问题
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
示例:
示例 1:
输入: "abcabcbb"
输出: 3
解释: 无重复字符的最长子串是 "abc",其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 无重复字符的最长子串是 "b",其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 无重复字符的最长子串是 "wke",其长度为 3。
示例 4:
输入: ""
输出: 0
解释: 无重复字符的最长子串是 "",其长度为 0。
解题思路:
解决该问题的方法有很多,比较常用的方法之一是滑动窗口 算法。滑动窗口算法是一种贪心算法,通过移动一个窗口来遍历整个字符串,并在窗口内统计不重复字符的数量。当窗口内出现重复字符时,窗口向右移动一位,直到窗口内不再有重复字符。此时,窗口内的字符数量即为当前无重复字符的最长子串长度。
详细步骤:
-
初始化窗口边界left和right,并设置变量max_length记录无重复字符的最长子串长度。
-
循环遍历字符串,当right指针遇到重复字符时,将left指针向右移动一位,直到窗口内不再有重复字符。
-
在每次窗口移动后,计算窗口内的字符数量,并更新max_length的值。
-
循环结束后,返回max_length的值。
代码实现:
def length_of_longest_substring(s):
"""
:type s: str
:rtype: int
"""
# 初始化窗口边界和最长子串长度
left = 0
right = 0
max_length = 0
# 记录窗口内字符出现的次数
char_count = {}
# 遍历字符串
while right < len(s):
# 如果当前字符不在窗口内,则将其加入窗口
if s[right] not in char_count:
char_count[s[right]] = 0
# 如果当前字符在窗口内,则将其出现次数加 1
char_count[s[right]] += 1
# 计算窗口内的字符数量
char_count_sum = sum(char_count.values())
# 如果窗口内字符数量大于窗口长度,则窗口向右移动一位
while char_count_sum > right - left + 1:
char_count[s[left]] -= 1
left += 1
char_count_sum -= 1
# 更新无重复字符的最长子串长度
max_length = max(max_length, right - left + 1)
# 右指针右移
right += 1
# 返回无重复字符的最长子串长度
return max_length
“无重复字符的最长子串”问题看似简单,但它蕴含着算法的基本原理和技巧。通过对该问题的深入理解和代码实现,我们可以进一步提升自身的编程能力。在解决实际问题时,灵活运用滑动窗口算法,可以有效地解决许多字符串处理问题。