基于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 }