题目:LCR 016
解法:滑动窗口
创建左右指针,分别指向子串的开始和结尾,右指针向右扩张,当第一次遍历到重复字符时,记录此时子串的长度。然后左指针开始收缩,当收缩到重复字符不再重复时,右指针继续向右遍历。
public int lengthOfLongestSubstring(String s) {
if (s.isEmpty()) return 0;
int[] arr = new int[128];
int left = 0, right = 0, res = 0;
while (right < s.length()) {
if (arr[s.charAt(right)] != 0) {
do {
arr[s.charAt(left)] = 0;
left++;
} while (s.charAt(left - 1) != s.charAt(right));
} else {
arr[s.charAt(right)] = 1;
right++;
}
res = Math.max(res, right - left);
}
return res;
}
注意:
-
官方解法用
Set
频繁add
和remove
,反而效率低 -
官方解法中,左指针每次收缩一个单位,不如直接收缩到第一个重复字符的位置