【LeetCode】567. 字符串的排列

class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        int n1=s1.size(),n2=s2.size();
        if(n1>n2)
            return false;
        vector<int> count1(26),count2(26);
        for(int i=0;i<n1;++i)
        {
            ++count1[s1[i]-'a'];
        }

        int left,right,start=-1;
        
        for(int j=0;j<=n2-n1;++j)    //构造第一个滑动窗口
        {
            if(count1[s2[j]-'a'])
            {
                start=j;
                for(int k=0;k<n1;++k)
                {
                    ++count2[s2[j+k]-'a'];
                }
                if(count1!=count2)
                {
                    break;
                }
                else
                    return 1;
            }
        }

        if(start!=-1)               //若有满足条件的滑动窗口,则继续构建
        for(int j=start+1;j<=n2-n1;++j)
        {
            --count2[s2[j-1]-'a'];
            ++count2[s2[j+n1-1]-'a'];
            if(count1!=count2)   
            {
                continue;
            }
            return 1;
        }
        return 0;
    }
};

使用计数数组比较字符串是否相等,而不是重新排列后对比。注意窗口滑动时的改变。

posted @ 2022-02-05 20:39  Jerry2km1  阅读(52)  评论(0)    收藏  举报