这是一个关于字符串的经典问题,给定一个字符串,求出其中最长的不含有重复字符的子串。例如,给定字符串 abcabcbb
,则其中最长的不含重复字符的子串为 abc
,长度为 3
。
一种解决这个问题的方法是使用滑动窗口。我们可以从字符串的开头开始,逐个添加字符,直到出现重复字符,然后从重复字符的位置开始继续添加字符。每次添加字符时,我们可以使用一个哈希表来存储字符的位置,如果当前字符已经出现过,则更新哈希表中字符的位置,并更新窗口的起始位置。
具体思路如下:
当我们遍历字符串时,可以用一个滑动窗口来维护当前不含重复字符的子串。每次添加字符时,如果该字符在窗口中已经出现过,则更新窗口的起始位置,使窗口不包含重复字符。
算法的具体步骤如下:
start
和结束位置 end
,初始时 start=0
和 end=0
。char_index
来存储字符在字符串中的位置。max_len
表示最长不含重复字符的子串的长度,初始时设为 0
。char
,当前字符在字符串中的位置为 index
。char
已经在窗口中出现过,即字符 char
在哈希表 char_index
中对应的值不为 0
,并且该值大于等于窗口的起始位置 start
,则更新窗口的起始位置 start
为 char_index[char] + 1
。end
为 index
,并更新哈希表 char_index
中字符 char
对应的值为 index
。max_len
,即 max_len = max(max_len, end - start + 1)
。max_len
。以下是一个用 Python 实现的示例代码:
def length_of_longest_substring(s: str) -> int:
# 定义窗口的起始位置和结束位置
start: int = 0
end: int = 0
# 定义一个哈希表存储字符的位置
char_index: dict = {}
# 最长不含重复字符的子串的长度
max_len: int = 0
# 遍历字符串
for index, char in enumerate(s):
# 如果字符 char 已经在窗口中出现过,更新窗口的起始位置
if char in char_index and char_index[char] >= start:
start = char_index[char] + 1
# 更新窗口的结束位置和窗口中字符 char 的位置
end = index
char_index[char] = index
# 更新最长不含重复字符的子串的长度
max_len = max(max_len, end - start + 1)
return max_len
使用该算法,我们可以输入字符串 abcabcbb
,得到最长不含重复字符的子串的长度 3
,即为题目中给出的示例的答案。
全部0条评论
快来发表一下你的评论吧 !