给定一个字符串 s,请你找出其中不含有重复字符的 最长子串 的长度
时间: 2024-06-15 09:07:34 浏览: 187
给定一个字符串 s,我们需要找出其中不含有重复字符的最长子串的长度。可以使用滑动窗口的方法来解决这个问题。
滑动窗口是一种常用的解决子串或子数组问题的方法。它通过维护一个窗口,来遍历整个字符串。具体步骤如下:
1. 定义两个指针,left 和 right,分别表示窗口的左边界和右边界。
2. 初始化最长子串的长度为 0,定义一个集合 set 来存储窗口中的字符。
3. 遍历字符串 s,不断移动右指针 right,并将对应的字符加入到集合 set 中。
4. 如果集合 set 中已经存在当前字符,表示出现了重复字符,需要移动左指针 left,并将对应的字符从集合 set 中移除,直到集合 set 中不再包含重复字符。
5. 在每次移动左指针 left 和右指针 right 后,更新最长子串的长度为 max(maxLength, right - left + 1)。
6. 重复步骤 3-5,直到遍历完整个字符串 s。
最终得到的 maxLength 就是不含有重复字符的最长子串的长度。
相关问题
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度
题目描述:
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路:
使用滑动窗口的思想,维护一个窗口,窗口内的元素不重复,每次移动右边界,如果右边界的元素在窗口内出现过,则移动左边界,直到窗口内不再有重复元素。
代码实现:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
你的问题可以通过使用滑动窗口算法来解决。具体实现如下:
1. 定义一个字典来存储字符和它们在字符串中的最近一次出现的索引。
2. 定义两个指针 left 和 right,分别指向子串的左右边界。
3. 当右指针指向的字符在字典中已经存在时,更新左指针的位置为该字符在字典中的最近一次出现的索引加1。
4. 在遍历过程中,记录每个不重复子串的最大长度,并返回该长度。
以下是实现代码:
```
def lengthOfLongestSubstring(s: str) -> int:
char_dict = {} # 存储每个字符及其最近一次出现的索引
left = 0 # 左指针,子串左边界
max_len = 0 # 不重复子串的最大长度
for i, char in enumerate(s):
if char in char_dict and char_dict[char] >= left:
left = char_dict[char] + 1
char_dict[char] = i
max_len = max(max_len, i - left + 1)
return max_len
```
你可以使用该函数进行测试:
```
s = "abcabcbb"
print(lengthOfLongestSubstring(s)) # 输出3,对应的不重复子串为"abc"
s = "bbbbb"
print(lengthOfLongestSubstring(s)) # 输出1,对应的不重复子串为"b"
s = "pwwkew"
print(lengthOfLongestSubstring(s)) # 输出3,对应的不重复子串为"wke"
s = ""
print(lengthOfLongestSubstring(s)) # 输出0,空字符串不存在不重复子串
s = " "
print(lengthOfLongestSubstrng(s)) # 输出1,空格""为不重复子串
```
阅读全文