3. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
对于本题看到求字符串中符合条件的最长子串,联想到209. 长度最小的子数组和713. 乘积小于 K 的子数组。同样的操作(双指针滑动窗口)只是不同的条件判断。
// 字符及出现的次数
Map<Character,Integer> map = new HashMap<>();
// 左指针 结果
int left=0,res=0;
// 枚举右指针
for(int right=0;right<s.length();right++){
char temp = s.charAt(right);
// 当前字符出现次数计算
map.put(temp,map.getOrDefault(temp,0)+1);
// 出现次数大于1且左指针小于等于右指针时 进行左指针右移
while(map.get(temp) > 1 && left<=right){
// 左指针右移 对应左指针所在字符进行次数递减
map.put(s.charAt(left),map.get(s.charAt(left))-1);
left++;
}
// 比较并取最大长度
res = Math.max(res,(right-left+1));
}
return res;
运行结果如下:
个人见解不喜勿喷!!!