给定一个字符串,请你找出其中不含有重复字符的最长子串的长度
时间: 2023-10-14 10:45:50 浏览: 114
题目描述:
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题思路:
使用滑动窗口的思想,维护一个窗口,窗口内的元素不重复,每次移动右边界,如果右边界的元素在窗口内出现过,则移动左边界,直到窗口内不再有重复元素。
代码实现:
相关问题
给定一个字符串 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` 的移动,不断更新不含重复字符的子串的左右边界,并计算其长度。
阅读全文