给定一个字符串,请你找出其中不含有重复字符的 最长子串的长度。
时间: 2024-03-01 10:45:19 浏览: 111
好的,这是一个比较经典的字符串问题。我可以给你提供一种解法,使用滑动窗口来解决。
具体来说,我们可以使用两个指针,分别表示当前子串的左右边界。我们先将左指针和右指针都初始化为 0,然后不断地增加右指针,同时更新最长子串的长度。如果发现右指针所指向的字符已经在当前子串中出现过了,那么我们就需要移动左指针,直到当前子串中不再包含重复的字符为止。
下面是具体的实现过程:
```python
def lengthOfLongestSubstring(s: str) -> int:
n = len(s)
if n == 0:
return 0
left, right = 0, 0
max_len = 1
char_set = set()
while right < n:
if s[right] not in char_set:
char_set.add(s[right])
right += 1
max_len = max(max_len, right - left)
else:
char_set.remove(s[left])
left += 1
return max_len
```
时间复杂度为 O(n),空间复杂度为 O(min(n, m)),其中 m 表示字符集的大小。
相关问题
给定一个字符串 s ,找出其中不含有重复字符的最长子串的长度代码
在编程中,我们通常使用滑动窗口或者双指针的方法来解决这个问题,这里我会给你一个简洁的Python代码示例:
```python
def lengthOfLongestSubstring(s):
if not s:
return 0
seen = {}
start = maxLength = 0
for end in range(len(s)):
# 如果当前字符已经在seen中并且start还没超过那个位置,说明有重复字符
if s[end] in seen and start <= seen[s[end]]:
start = seen[s[end]] + 1
else:
maxLength = max(maxLength, end - start + 1) # 更新最大长度
seen[s[end]] = end # 把当前字符及其索引添加到字典中
return maxLength
```
这个函数的工作原理是遍历字符串s,维护一个窗口(通过end指针),并在窗口内检查是否有重复字符。如果发现重复,就移动起始点(start)到重复字符之后的第一个未见过的字符处。这样可以保证在任何时候,窗口内的字符都是唯一的。
给定一个字符串 s ,找出其中不含有重复字符的最长子串的长度代码c语言
在C语言中,可以使用滑动窗口(Sliding Window)算法来解决这个问题。滑动窗口是一种常见的动态规划思想,通过维护一个字符集窗口,每次检查新字符是否已经在集合中,如果不在则加入窗口并更新最大长度,如果在则移除窗口左侧的第一个已重复字符。
下面是一个简单的C语言函数实现:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_CHAR 128
int lengthOfLongestSubstring(char* s) {
int n = strlen(s);
bool char_set[MAX_CHAR] = {false}; // 用于记录字符是否出现过
int left = 0, right = 0;
int maxLength = 0;
while (right < n) {
if (!char_set[s[right]]) {
// 如果字符未出现,则添加到窗口
char_set[s[right]] = true;
maxLength = max(maxLength, right - left + 1); // 更新最大长度
right++;
} else {
// 如果字符已经出现,移除左侧的重复字符
char_set[s[left]] = false; // 将左边界字符设回未出现
left++; // 移动左边界
}
}
return maxLength;
}
// 辅助函数,返回两个数的最大值
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
char str[] = "abcabcbb";
printf("Length of the longest substring without repeating characters: %d\n", lengthOfLongestSubstring(str));
return 0;
}
```
在这个代码中,`lengthOfLongestSubstring` 函数接收一个字符串指针,通过双指针 `left` 和 `right` 的移动,不断更新不含重复字符的子串的左右边界,并计算其长度。
阅读全文