1.题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
2.思路
思路:滑动窗口
例子:”abcbbcbb”
start和end初始为0.
初始化set,里面存放满足滑动窗口的字符。条件是:在start到end这个窗口中不能有重复的字符。
结果用r表示,初始化为0
end=0,a不在set中,将a加入到set,扩大窗口,end++,此时start=0,end=1,set=a。r=max(r, end-satrt)=1.
end=1,b不在set中,将b加入到set,扩大窗口,end++,此时start=0,end=2,set=a,b。r=max(r, end-start) = 2.
end=2,c不在set中,将c加入到set,扩大窗口,end++,此时start=0,end=3,set=a,b,c。r=max(r, end-start) = 3;
end=3,b在set中,将s.chartAt(start)为a从set中移除,缩小窗口,start++,此时start=1,end=3,set=b,c。r=max(r, end-start) = 3;
end=3,b还在set中,将s.charAt(start)为b从set中移除,缩小窗口,start++,此时start=2,end=3,set=c。r=max(r, end-satrt)=3
end=3,b不在set中,将b加入到set,扩大窗口,end++,此时start=2,end=4,set=c,b
end=4,b在set中,将s.chartAt(start)为c从set中移除,缩小窗口,start++,此时start=3,end=4,set=b。r=max(r, end-satrt)=3
end=4,b在set中,将s.chatAt(start)为b从set中移除,缩小窗口,start++,此时start=4,end=4,set=null。r=max(r, end-satrt)=3
end=4,b不在set中,将b加入到set,扩大窗口,end++,此时start=4,end=5,set=b。r=max(r, end-satrt)=3
end=5,c不在set中,将c加入到set,扩大窗口,end++,此时start=4,end=6,set=b,c。r=max(r, end-satrt)=3.
end=6,b在set中,将s.charAt(start)为b从set中移除,缩小窗口,start++,此时start=5,end=6,set=c。r=max(r, end-satrt)=3
end=6,b不在set中,将b加入到set中,扩大窗口,end++,此时start=5,end=7,set=c,b。r=max(r, end-satrt)=3
end=7,b在set中,将s.charAt(start)为c从set中移除,缩小窗口,start++,此时start=6,end=7,set=b。r=max(r, end-satrt)=3
end=7,b在set中,将s.charAt(start)为b从set中移除,缩小窗口,start++,此时start=7,end=7.set=null。r=max(r, end-satrt)=3
end=7,b不在set中,将b加入到set中,扩大窗口,end++,此时start=7,end=8,set=b。r=max(r, end-satrt)=3
此时end=8 > 字符串长度。退出。
最后结果为3。
3.代码
public int lengthOfLongestSubStr(String s) { if(s == null) {return 0;} int start = 0, end = 0; int res = 0; HashSet set = new HashSet(); while(start < s.length() && end < s.length()) { if(!set.contains(s.charAt(end))) { set.add(s.charAt(end++)); res = max(res, end -start); }else { set.remove(s.charAt(start++)); } } return res; }