题目
- Problem: 3. 无重复字符的最长子串
- 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
- 0 <= s.length <= 5 * 10 ^ 4
- s 由英文字母、数字、符号和空格组成
思路
Java + 滑动窗口
第 1 步:
- 首先判空,
- 然后使用滑动窗口,每次符合要求时校验最大值
第 2 步:
- 滑动窗口:开左右两个端点,右端点每次向右移动一位,判断左右端点间是否符合要求,符合则继续,不符合则左端点向右滑动到最左满足要求的位置再继续
复杂度
时间复杂度:
时间复杂度,: O ( n ) O(n) O(n)
空间复杂度:
空间复杂度: O ( n ) O(n) O(n)
Code
class Solution {
/**
* Java + 滑动窗口
*
* 第 1 步:
* 首先判空,
* 然后使用滑动窗口,每次符合要求时校验最大值
*
* 第 2 步:
* 滑动窗口:开左右两个端点,右端点每次向右移动一位,判断左右端点间是否符合要求,符合则继续,不符合则左端点向右滑动到最左满足要求的位置再继续
*/
public int lengthOfLongestSubstring(String s) {
// 判空
if (s == null || s.length() == 0) {
return 0;
}
// 滑动窗口,每次符合要求时校验最大值
int res = 0;
Map<Character, Integer> mapCharCount = new HashMap<>();
for (int left = 0, right = 0; right < s.length(); right++) {
char rightChar = s.charAt(right);
mapCharCount.merge(rightChar, 1, Integer::sum);
while (mapCharCount.get(rightChar) > 1) {
char leftChar = s.charAt(left);
mapCharCount.merge(leftChar, -1, Integer::sum);
left++;
}
res = Math.max(right - left + 1, res);
}
return res;
}
}