滑动窗口相关题目(java版和js版)
Posted 每天都要喝白开水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了滑动窗口相关题目(java版和js版)相关的知识,希望对你有一定的参考价值。
3. 无重复字符的最长子串
找出从每一个字符开始的,不包含重复字符的最长子串。
思路:
- 1.创建一个set
- 2.两个指针(不要被这个名词吓到)第一个指向字符串的开头j, 第二个随着for循环遍历字符串i。
- 3.如果set里没有s[j],说明目前为止还没有重复的字符,把s[i]添加到set里,然后更新最大不重复字符的数量。
- 4.如果set里有s[i],则从set里开始删除s[j],并且j递增,再检查set里是否有s[i],如此反复直到set里没有s[i]为止,while循环结束后,再将当前的s[i]加进去
- 5.重复步骤3和4,直到遍历完整个字符串j
其实可以这样理解,两个指针维护的就是一个窗口,我们需要做的就是保证在这个窗口里面,没有重复字符。在while循环中删除了set[j]还是为了在当前窗口中没有重复的字符串。当然此时右边的指针i是不用移动的,因为前面都已经判断出了[j,i]区域的字符串是不重复的。如果一直遇见ccccccc这种重复的,滑动窗口大小始终为1,ij指针重合。
java
class Solution {
public int lengthOfLongestSubstring(String s) {
HashSet<Character> set=new HashSet<>();
int maxLength=0;
int j=0;
if(s.length()==0){
return 0;
}
for(int i=0;i<s.length();i++){
if(!set.contains(s.charAt(i))){
set.add(s.charAt(i));
//加入新的元素,则窗口往后面移动一格
maxLength=Math.max(maxLength,set.size());
}else{
while(set.contains(s.charAt(i))){
//移动左边的指针
set.remove(s.charAt(j));
j++;
}
//删除后要加上新的set中没有的字符
set.add(s.charAt(i));
}
}
return maxLength;
}
}
滑动窗口还有更优雅的做法
javascript
var lengthOfLongestSubstring = function(s) {
let set=new Set();
let i=0,j=0,maxLength=0;
if(s.length===0){
return 0;
}
for(i;i<s.length;i++){
if(!set.has(s[i])){
set.add(s[i]);
maxLength=Math.max(maxLength,set.size)
}else{
while(set.has(s[i])){
set.delete(s[j]);
j++;
}
set.add(s[i]);
}
}
return maxLength;
};
set 的操作 add delete
以上是关于滑动窗口相关题目(java版和js版)的主要内容,如果未能解决你的问题,请参考以下文章
剑指 Offer 59 - I. 滑动窗口的最大值 c++/java详细题解
剑指 Offer 59 - I. 滑动窗口的最大值 c++/java详细题解
精选力扣500题 第69题 239. 滑动窗口最大值c++/java详细题解
剑指Offer(Java版)第六十七题:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口