滑动窗口思想升级,使用一个数组保存字符是否出现过。
题目
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。
给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。
给定 “pwwkew” ,最长子串是 “wke” ,长度是3。请注意答案必须是一个子串,”pwke” 是 子序列 而不是子串。
代码
class Solution {
public int lengthOfLongestSubstring(String s) {
int length = s.length();
if(length==0){
return 0;
}
//构建滑动窗口
int l = 0;
int r = -1;
int result = 0;//子串长度为0
int []freq = new int[256]; //用于保存字符是否出现,0表示没有,1表示出现过
while (l<length){
if( r+1<length && freq[ s.charAt(r+1) ]==0 ){ //注意r是从-1开始
r++;
freq[ s.charAt(r) ] ++;
}else{ //说明右边界无法扩展,左边界移动
freq[ s.charAt(l++) ] --;
}
result = Math.max(result,r-l+1);
}
return result;
}
}