一:题目
二:上码
class Solution {
/**
分析:1.滑动窗口问题
2.何时更改窗口的起点位置
当出现重复的时候 需要从重复的字符的下一个字符开始计算
*/
public int lengthOfLongestSubstring(String s) {
if (s.length() <= 1) {
return s.length();
}
int slowIndex = 0;
int fastIndex = 0;
int max = 0;
Map <Character,Integer> map = new HashMap<>();
for (; fastIndex < s.length(); fastIndex++) {
//先检查有没有包含的某个字符 比如 容器中已经装入 abc 那么下一个字符a 判断是否含有的时
//候 如果有的话 那就要更改在已有字符中的 滑动窗格的左边的位置
if (map.containsKey(s.charAt(fastIndex))) {
//为何要取和slowIndex进行比较呢
//因为窗口的左边界是不断往左移动的 不能往回走 否则会出现重复的字符被误算其中
slowIndex = Math.max(slowIndex,map.get(s.charAt(fastIndex))+1);
// slowIndex = map.get(s.charAt(fastIndex))+1;
}
map.put(s.charAt(fastIndex),fastIndex);
//每次计算最大值的时候 就是在计算当前坐标的最大值 比如 abcb 那么当fastIndex指向c的时候
//此时求出 max = 3,当指向b的时候 出现了重复 此时需要修改slowindex = 2
max = Math.max(max,fastIndex -slowIndex +1);
}
return max;
}
}
hxd们 俺菜鸡杰又回来了 3 2 1 奏曲…