用滑动窗口
主要注意滑动窗口的滑动的条件
用两个指针,从最左边开始,右指针向右移动,并且右指针移动后,将对应字符存入set中,当右指针指向的字符已经存在set中时,就移动左指针,然后set删去左指针对应的字符,直到set中没有右指针对应的字符时,左指针停止移动
public class Offer48 {
/** 滑动窗口,*/
public int lengthOfLongestSubstring(String s) {
/** 先将字符串转化为字符数组*/
char[] chars = s.toCharArray();
/** 创建一个set用来存放滑动过的字符,判断窗口中是否有相同字符*/
HashSet<Character> set = new HashSet<>();
/** 定义两个指针 和 最大窗口长度*/
int left = 0,right = 0;
int max = 0;
/** 开始滑动,从0开始,如果右边界的字符已经在窗口中存在,那么,就移动左边界,直到窗口中不包含右边界*/
for (; right < chars.length; right++){
while (set.contains(chars[right])){//移动左边界
set.remove(chars[left]);
left++;
}
set.add(chars[right]);//将窗口新加入的字符加入set中去
max = Math.max(right-left+1,max);
}
return max;
}
}