目录
题目:
给定一个字符串
s
,请你找出其中不含有重复字符的 最长子串的长度。示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"是一个子序列,不是子串。提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
1. 思路
要找出字符串中不含重复字符的最长子串的长度,可以使用滑动窗口的方法解决。滑动窗口是一种用于解决子串或子数组问题的常见技巧。它通过维护一个窗口,来动态地调整子串的位置。在本问题中,我们可以使用两个指针来表示滑动窗口的左右边界,同时用一个哈希集合来存储窗口中的字符。通过不断移动右指针扩大窗口,并更新窗口中的字符集合,以确保窗口中的字符没有重复。如果遇到重复字符,我们需要移动左指针缩小窗口,直到窗口中没有重复字符为止。在遍历过程中,不断更新最长子串的长度。
2. 解题方法
- 创建一个哈希集合用于存储窗口中的字符。
- 使用两个指针
left
和right
分别表示滑动窗口的左右边界,初始值都为0。 - 遍历字符串
s
,移动右指针right
扩大窗口,直到窗口中出现重复字符或右指针到达字符串末尾。 - 如果遇到重复字符,移动左指针
left
缩小窗口,直到窗口中不含重复字符为止。 - 在遍历过程中不断更新最长子串的长度。
- 返回最长子串的长度。
3. 复杂度
- 时间复杂度:遍历字符串需要 O(n) 的时间,其中 n 是字符串的长度。
- 空间复杂度:哈希集合的最坏情况下需要存储字符串的所有字符,因此空间复杂度为 O(min(n, m)),其中 n 是字符串的长度,m 是字符集的大小。
4. Code
class Solution {
public int lengthOfLongestSubstring(String s) {
// 创建一个哈希集合用于存储窗口中的字符
Set<Character> set = new HashSet<>();
int n = s.length();
int maxLength = 0;
int left = 0, right = 0;
// 使用两个指针分别表示滑动窗口的左右边界
while (right < n) {
// 如果窗口中不含重复字符,右指针向右移动扩大窗口
if (!set.contains(s.charAt(right))) {
set.add(s.charAt(right));
maxLength = Math.max(maxLength, right - left + 1);
right++;
} else { // 如果窗口中出现重复字符,左指针向右移动缩小窗口
set.remove(s.charAt(left));
left++;
}
}
return maxLength;
}
}
这段代码实现了找出字符串中不含重复字符的最长子串的长度。利用滑动窗口的方法,遍历字符串一次即可得到结果。
欢迎大家后台联系讨论。