字符串的排列【滑动窗口】

题目链接

解题思路:

用map存入窗口中26个字母的次数

滑动维护对比即可

写的有点复杂,看了一下题解,用的是vector对比,发现vector的对比的写法还不会,记录一下,简单很多

map写法

class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        map<int,int>mp1;
        map<int,int>mp2;
        int left=0;
        int right=s1.length()-1;
        int len;
        if(s1.length()>s2.length()){
            return false;
        }
        if(s1==s2){
            return true;
        }
        for(int i=0;i<s1.length();i++){
            mp1[s1[i]]++;
            mp2[s2[i]]++;
        }
        int flag=0;
        while(right<s2.length()&&!flag){
            flag=1;
            len=0;
            for(int i='a';i<='z';i++){
                if(mp1[i]!=mp2[i]){
                    flag=0;
                    len=len+abs(mp1[i]-mp2[i]);              
                }
            }
            if(flag==1){
                return true;
            }
            len=len/2;
            if(len==0||right+len>s2.length()){
                break;
            }
            for(int i=left;i<left+len;i++){
                mp2[s2[i]]--;
            }
            left=left+len;
            for(int i=right+1;i<=right+len;i++){
                mp2[s2[i]]++;
            }
            right=right+len;
        }
        return false;
    }
};

vector写法

class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        int n = s1.length(), m = s2.length();
        if (n > m) {
            return false;
        }
        vector<int>cnt1(26);//必须用(26)这种指定vector的大小才可以直接对比
        vector<int>cnt2(26);
        for (int i = 0; i < n; i++) {
            cnt1[s1[i] - 'a']++;
            cnt2[s2[i] - 'a']++;
        }
        if (cnt1 == cnt2) {
            return true;
        }
        for (int i = n; i < m; i++) {
            cnt2[s2[i] - 'a']++;
            cnt2[s2[i - n] - 'a']--;
            if (cnt1 == cnt2) {
                return true;
            }
        }
        return false;
    }
};

 

posted @ 2022-01-22 18:30  夜灯长明  阅读(29)  评论(0编辑  收藏  举报