1.给定一个字符串,请从这个字符串中找出所有最长的没有重复字符的子串,并返回最长不重复子串的长度,例如: 字符串:asdfwedferrf ==> 最长不重复子串:asdfwe,长度6 字符串:wpwswekedw ==> 最长不重复子串:swek, kedw,长度4
时间: 2024-04-29 21:22:41 浏览: 6
解法:
可以使用滑动窗口的方法来解决该问题。
定义一个字典,用于记录每个字符最后出现的位置。定义一个起始位置 start 和最长长度 max_len,初始化为 0。
遍历字符串,如果当前字符不在字典中,或者当前字符在字典中的位置在起始位置之前,则更新字典中当前字符的位置值为当前索引,更新最长长度为当前索引减去起始位置加 1。
如果当前字符在字典中的位置在起始位置之后,则更新起始位置为该字符在字典中的位置加 1。
最后返回最长长度即可。
代码实现如下:
```python
def longestSubstring(s: str) -> int:
char_dict = {}
start, max_len = 0, 0
for i, char in enumerate(s):
if char in char_dict and char_dict[char] >= start:
start = char_dict[char] + 1
char_dict[char] = i
max_len = max(max_len, i - start + 1)
return max_len
```
测试:
```python
print(longestSubstring("asdfwedferrf")) # 6
print(longestSubstring("wpwswekedw")) # 4
```
相关问题
请你找出其中不含有重复字符的最长子串的长度给定一个字符串 s,
给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。根据提供的示例,我们可以使用滑动窗口的方法来解决这个问题。滑动窗口是一个可变大小的窗口,它可以在字符串上滑动,以找到不含有重复字符的最长子串。
具体步骤如下:
1. 定义一个字典来记录字符在当前窗口中出现的次数。
2. 定义两个指针left和right,分别表示当前窗口的左边界和右边界。
3. 初始化最长子串的长度max_length为0。
4. 当right指针小于字符串长度时,执行以下步骤:
- 将right指针指向的字符加入到字典中,并增加其出现次数。
- 如果字典中right指针指向的字符的出现次数大于1,说明窗口中出现了重复字符,需要缩小窗口。
- 缩小窗口的方式是将left指针指向的字符从字典中减少其出现次数,并将left指针右移一位。
- 更新最长子串的长度max_length为当前窗口的长度和max_length中的较大值。
- 将right指针右移一位。
5. 返回最长子串的长度max_length。
题目1:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
给定一个字符串 s ,要找出其中不含有重复字符的最长子串的长度,可以使用滑动窗口的方法来解决。滑动窗口是指在一个字符串或数组上维护一个窗口,通过移动窗口的起始位置和结束位置来寻找目标子串。
具体的步骤如下:
1. 创建一个空的集合(用来检测字符是否重复)和两个指针,分别指向子串的起始位置和结束位置。
2. 将结束位置的字符添加到集合中。
3. 如果集合中已经存在当前字符,则移动起始位置的指针,并从集合中删除起始位置的字符,直到集合中不再存在当前字符。
4. 更新最长子串的长度(结束位置 - 起始位置 + 1)。
5. 将结束位置的指针向右移动一位,并将新字符添加到集合中。
6. 重复步骤2到5,直到结束位置达到字符串的末尾。
下面是使用滑动窗口方法的Python代码实现:
```python
def lengthOfLongestSubstring(s):
if not s:
return 0
charset = set()
start = 0
max_len = 0
for end in range(len(s)):
while s[end] in charset:
charset.remove(s[start])
start += 1
charset.add(s[end])
max_len = max(max_len, end - start + 1)
return max_len
```