题目要求检测出给定字符串的一个子串(该子串不能含有重复出现的字符)
想法:
用HashMap记录出现的字符以及其最后一次出现的下标,用containsKey检测重复性,若重复,则将滑动窗口的左边界移动到最后一次出现该字母的位置;遍历字符无论是否遇见过,都应该更新map中该字母的下标及最长子串的长度。
代码:
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> used = new HashMap<>();
int max = 0;
int left = 0;
for (int i = 0; i < s.length(); i++) {
if (used.containsKey(s.charAt(i))) {
left = Math.max(left, used.get(s.charAt(i)) + 1);
}
used.put(s.charAt(i), i);
max = Math.max(max, i - left + 1);
}
return max;
}