用Python完成这道题目:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
时间: 2023-03-06 16:21:17 浏览: 145
以下是用Python实现的代码:
```python
def length_of_longest_substring(s):
# 定义一个字典用于存储字符及其出现的下标
char_dict = {}
# 定义左右指针和最大长度
left, right, max_length = 0, 0, 0
# 遍历字符串
for i in range(len(s)):
# 如果字符已经在字典中,并且其下标在左指针右侧,则将左指针移动到该字符的下一位
if s[i] in char_dict and char_dict[s[i]] >= left:
left = char_dict[s[i]] + 1
# 更新当前字符的下标
char_dict[s[i]] = i
# 更新右指针和最大长度
right = i
max_length = max(max_length, right - left + 1)
return max_length
```
该函数的基本思路是使用双指针和字典。遍历字符串时,右指针不断向右移动,将每个字符及其出现的下标存储在字典中。如果遇到重复字符,则将左指针移动到该字符的下一位,同时更新字典中对应字符的下标。遍历完整个字符串后,最大长度即为右指针和左指针之差加 1。
相关问题
题目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
```
Python 给定一个字符串 s,请找出其中不含有重复字符的最长子串的长度
Python 中给定一个字符串 s,可以使用滑动窗口法来找出其中不含有重复字符的最长子串的长度。
代码如下:
```
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
n = len(s)
# 哈希集合,记录每个字符是否出现过
st = set()
# 右指针,初始值为 -1,目的是把它作为整个滑动窗口的左边界
rk, ans = -1, 0
for i in range(n):
if i != 0:
# 左指针向右移动一格,移除一个字符
st.remove(s[i - 1])
while rk + 1 < n and s[rk + 1] not in st:
# 不断地移动右指针
rk += 1
st.add(s[rk])
# 第 i 到 rk 个字符是一个极长无重复字符子串
ans = max(ans, rk - i + 1)
return ans
```
该代码的时间复杂度为 $O(n)$,空间复杂度为 $O(k)$,其中 $k$ 为字符集的大小。
阅读全文