描述
分析
滑动窗口,记录窗口中的所有出现的字符,然后窗口左边界固定,右边界右滑,如果,窗口中不存在新的字符,则右滑成功,否则左边界右滑,直到窗口中不存在右边界的值。
描述感觉不清晰,直接看代码吧!!
代码
版本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))); // 更新左指针 i
dic.put(s.charAt(j), j); // 哈希表记录
res = Math.max(res, j - i); // 更新结果
}
return res;
}
}
面试公司
阿里