3. 无重复字符的最长子串:
题目链接 :剑指 Offer 54. 二叉搜索树的第k大节点
题目:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
思路:
- 经典的滑动窗口,HashMap记录每种字符的出现次数,滑动窗口的三个要素:左、右侧窗口起点,窗口大小值。
- 本体要求窗口值为“只出现一次的字符”,那需要在记录字符出现次数的同时对字符出现次数更新,判断是否>1更新左侧窗口起点。
- 此处的i变量代表右侧窗口终点值,所以实际返回的i-left+1就是符合题目要求的窗口值。
AC代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
int left=0,max=0;
Map<Character,Integer> map=new HashMap<>();
for(int i=0;i<s.length();i++)
{
if(map.containsKey(s.charAt(i)))
{
left=Math.max(left,map.get(s.charAt(i))+1);
}
map.put(s.charAt(i),i);
//判断的是窗口值
max=Math.max(max,i-left+1);
}
return max;
}
}