力扣热题100 滑动窗口

滑动窗口

1.无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

       //滑动窗口定义left,right当arr有没有s[right]时right++;当arr有left ++;
var lengthOfLongestSubstring = function(s) {
            let arr = [];
            let left = 0;
            let right = 0;
            let maxLength = 0;
            if(s.length === 0 || s.length == 1) return s.length;
            while(right < s.length){
                if(arr.indexOf(s[right]) === -1){
                    right++;
                    
                }else{
                    left++;
                }
                arr = s.slice(left,right);
                maxLength = Math.max(maxLength,arr.length);
            }
            return maxLength ;
        };
        let str = "dvdf";
        console.log(lengthOfLongestSubstring(str));
//考虑用哈希。当arrmap没有s[i]则加入key设置value = i-left;当有时,left++删除arrmap里的s[left],并设置值
var lengthOfLongestSubstring = function(s){
    let arrMap = new Map();
    let left = 0;
    let maxLength = 0
    for(let i=0;i<s.length;i++){
        if(arrMap.has(s[i])){
            left ++;
        }
        arrMap.set(s[i],i-left);
        maxLength = Math.max(maxLength,arrMap.get(s[i]));
    }
    return maxLength;
}

2.找到字符串中所有字母异位词

给定两个字符串 sp,找到 s 中所有 p异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

//从s中截取p的长度字符串arr,把arr排序,符合条件就加入结果;left++,right++
var findAnagrams = function(s, p) {
    let left = 0;
    let right = p.length;
    let res = [];
    p = p.split('');
    p.sort();
    while(right<=s.length){
        let temp = s.slice(left,right);
        temp = temp.split('');
        temp.sort();
        if(temp.join('')==p.join('')){
            res.push(left);
        }
        left++;
        right++;
    }
    return res;
};
//呃。。。有点太耗时间了
//利用字符数量
var findAnagrams = function(s, p) {
    let left = 0;
    let right = p.length;
    let res = [];
    //统计p中各字母数量
    let temp2 = new Map();
    for(let k=0;k<p.length;k++){
        if(temp2.has(p[k])){
            temp2.set(p[k],temp2.get(p[k])+1);
        }else{
            temp2.set(p[k],1);
        }
    }
    while(right<s.length){
        let temp = s.slice(left,right);
        let temp1 = new Map();
        for(let i=0;i<temp.length;i++){
            if(temp1.has(temp[i])){
                temp1.set(temp[i],temp1.get(temp[i])+1);
            }else{
                temp1.set(temp[i],1);
            }
        }
        let flag = true;
        for(let [key,value] of temp1){
            if(temp2.get(key)!==value){
                flag = false;
                break;
            }
        }
        if(flag){
            res.push(left);
        }
        left++;
        right++;

    }
    return res;
};
2.1 方法

charCodeAt() 方法返回字符串中规定索引(下标)处字符的 Unicode。

charAt() 方法返回字符串中指定索引(下标)处的字符。

官方题解1
//记录26个字符的数量,窗口滑动时s第一个字符的数量-1,加上最后一个字符的数量+1
var findAnagrams = function(s, p) {
    let sArray = new Array(26).fill(0);
    let pArray = new Array(26).fill(0);
    let arr = [];
    if(p.length>s.length) return [];
    //初始化数据
    for(let i=0;i<p.length;i++){
        pArray[p[i].charCodeAt()-'a'.charCodeAt()]++;
        sArray[s[i].charCodeAt()-'a'.charCodeAt()]++;
    }
    if(pArray.join('')===sArray.join('')) arr.push(0);
    for(let j=0;j<s.length-p.length;j++){
        sArray[s[j].charCodeAt()-'a'.charCodeAt()]--;
        sArray[s[j+p.length].charCodeAt()-'a'.charCodeAt()]++;
        if(pArray.join('')===sArray.join('')) arr.push(j+1);
    }
    return arr;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值