3. 无重复字符的最长子串

基于s的范围暴力破解的话必然超时

这里采用滑动窗口的方案来处理

我们维护一个队列,依次将字符压入队列,当新遇到的字符

已经在队列中时,我们就需要将队列中已出现的位置前的字符全部弹出

来保证队列中永远不存在重复字符,同时每次队列更新后计算队列长度即可。

时间O(n),空间O(z)(与字符串s的离散度相关)

 1     public int lengthOfLongestSubstring(String s) {
 2         Map<Character,Integer> map = new HashMap<Character,Integer>();
 3         int max=0,left=0;
 4         for(int i=0;i<s.length();i++){
 5             // 判断窗口中是否出现重复字符
 6             if(map.containsKey(s.charAt(i))){
 7                 // 窗口内出现重复字符,则需要找出当前字符出现的位置tag,将窗口移动至tag+1处避免重复
 8                 left = Math.max(left,map.get(s.charAt(i))+1);
 9             }
10             // 更新当前字符的出现位置
11             map.put(s.charAt(i),i);
12             // 滑动窗口每次更新后
13             max = Math.max(max,i-left+1);
14         }
15         return max;
16     }
争取早日不再是一只菜鸡
原文地址:https://www.cnblogs.com/jchen104/p/14814700.html