描述
分析
滑动窗口,记录窗口中的所有出现的字符,然后窗口左边界固定,右边界右滑,如果,窗口中不存在新的字符,则右滑成功,否则左边界右滑,直到窗口中不存在右边界的值。
描述感觉不清晰,直接看代码吧!!
代码
版本1:
class Solution {public int lengthOfLongestSubstring(String s) {int left = 0, right = 0;Set<Character> set = new HashSet<>();int max = 0;while(right < s.length()) {if(!set.contains(s.charAt(right))) {set.add(s.charAt(right));right++;} else {set.remove(s.charAt(left));max = Math.max(max, right - left);left++;}}// 最后到终点了,也要再次判断最长长度max = Math.max(max, right - left);return max;}
}
版本2:(面试官推荐的版本)
class Solution {public int lengthOfLongestSubstring(String s) {Map<Character, Integer> dic = new HashMap<>();int i = -1, res = 0, len = s.length();for(int j = 0; j < len; j++) {if (dic.containsKey(s.charAt(j)))i = Math.max(i, dic.get(s.charAt(j))); // 更新左指针 idic.put(s.charAt(j), j); // 哈希表记录res = Math.max(res, j - i); // 更新结果}return res;}
}
面试公司
阿里