class Solution {
//双指针
public int lengthOfLongestSubstring(String s) {
//空字符串 特殊情况
if(null == s || s.length() == 0) return 0;
//记录某个字符的最新下表
Map<Character, Integer> map = new HashMap<>();
char cs[] = s.toCharArray();
int res = 0;
//i和j维持一个最大字符不重复滑动窗口
for(int i = 0, j = 0; i < cs.length; i++){
// habcab, 当左指针j = 0和右指针i = 4时,窗口大小为0到4,其中下表1和4字符都为'a',
//为了维护窗口没有重复字符,左指针要移动到下表为2位置才维护窗口没有重复字符,
//而map中记录了第一个'a'字符的下表,只需要向前移动一位即可。
if(map.containsKey(cs[i]) && map.get(cs[i]) >= j){
j = map.get(cs[i]) + 1;
}
map.put(cs[i], i);
res = Math.max(res, i - j + 1);
}
return res;
}
}
3.无重复字符的最长子串
于 2018-08-15 01:23:12 首次发布