思路
- 滑动窗口,设置left边界和最大值max,通过map来查询每个字符的下标
- 每当遍历到新的字符,分两步骤进行处理
- map获取字符下标,如果没有存,则代表是非重复字符串,添加map并更新max值max = Math.max(right - left + 1, max)
- 如果map已存在,更新窗口left = Math.max(left, indexOf(ch) + 1),并更新max = Math.max(right - left + 1, max)
class Solution {
public int lengthOfLongestSubstring(String s) {
// 滑动窗口
// 1. 设置窗口左边界和右边界,设置map记录字符和字符的最新(最大值)位置
// 2. 右边界递增判断添加的元素i是否已经添加过,如果已经添加过则查看其最大值位置是否大于left,left = max(left, indexOf(i)),然后map更新i下标;没添加过则直接添加到map
if (s.length() == 1) return 1;
char[] chs = s.toCharArray();
Map<Character, Integer> map = new HashMap();
int left = 0;
int max = 0;
for (int i = 0; i < chs.length; i++) {
if (map.get(chs[i]) != null) {
left = Math.max(left, map.get(chs[i]) + 1);
map.put(chs[i],i);
} else {
map.put(chs[i],i);
}
max = Math.max(i - left + 1, max);
}
return max;
}
}
Q.E.D.