Leetcode 算法入门——滑动窗口

解析:如何利用滑动窗口的方法解决该问题?

        创建快慢两个指针进行窗口的框定。

        快指针作为单调性的保持指针。第一次进入循环的时候将字符串记录在数组内表示已框定,如何编写如果出现重复则换一个窗口呢?当map又读取到相同字符时,就会出现慢指针的移动现象,慢指针会移动到和快指针同一起点,即开启了一个新的窗口。

int lengthOfLongestSubstring(char * s){
    //double node
    int max=0;
    int map[99999]={0};
    int length = strlen(s);
    for(int slow=0,fast=0;fast<length;fast++){
        map[s[fast]]++;
        while(map[s[fast]]>1&&slow<=length){
            map[s[slow++]]--;
        }
        if(fast-slow+1>max)
            max=fast-slow+1;
    }
    return max;
}

 解析:如何用滑动窗口作出这一道题。       

        核心:创建两个字典map,map1存放正确子串与map2进行比较,map2对整条子串进行记录

        第一个循环,用来把子串写入map1,然后进行初步的比对。若两个map一开始的字符都一样,那么可以直接就成了可以返回了。第二个循环,除去开始的几个字母,比对后面的字母。滑动窗口开始启用:走法是边走边判断,左一个去掉,右一个踏下去,是可以保持滑动窗口为length1的。

//judge system
bool equal(char* map1,char* map2){
    for(int i=0;i<26;i++){
        if(map1[i]!=map2[i])return 0;
    }
    return 1;
}

bool checkInclusion(char * s1, char * s2){
    //create two dictionary
    char map1[26] = {0};
    char map2[26] = {0};
    //get the length
    int length1 = strlen(s1),length2 = strlen(s2);
    //comparison of the length
    if(length1>length2)return 0;
    //get the data
    for(int i=0;i<length1;i++){
        ++map1[s1[i]-'a'];
        ++map2[s2[i]-'a'];
    }
    if(equal(map1,map2))return 1;
    for(int i=length1;i<length2;i++){
        ++map2[s2[i]-'a'];
        --map2[s2[i-length1]-'a'];
        if(equal(map1,map2)){
            return 1;
        }
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/rick030224/article/details/122245674