LeetCode

来源:互联网 发布:mac用的office 编辑:程序博客网 时间:2024/06/07 19:00

解题代码:

438:

classSolution {

public:

    vector<int> findAnagrams(string s,string p) {

        vector<int> res;

        vector<int> pp(26,0),ss(26,0);

        if(p.size()>s.size())

            return res;

        for(int i=0;i<p.size();i++){

            pp[p[i]-'a']++;

            ss[s[i]-'a']++;

        }

        if(pp==ss)

            res.push_back(0);

        for(int i=p.size();i<s.size();i++){

            ss[s[i]-'a']++;

            ss[s[i-p.size()]-'a']--;

            if(pp==ss)

                res.push_back(i-p.size()+1);

        }

        return res;

    }

};


567:

classSolution {

public:

    bool checkInclusion(string s1, string s2) {

        if(s2.size()<s1.size())

            return false;

        vector<int> s(26,0),t(26,0);

        for(int i=0;i<s1.size();i++){

            s[s1[i]-'a']++;

            t[s2[i]-'a']++;

        }

        if(s==t)

            return true;

        for(inti=s1.size();i<s2.size();i++){

            t[s2[i]-'a']++;

            t[s2[i-s1.size()]-'a']--;

            if(s==t)

                return true;

        }

        return false;

    }

};

 

解题思路:

将这两题放在一起的原因是两题比较相似,都是关于一个字符串中是否存在另一个字符串的其他排列。不同的是,567只需要判断是否存在,而438需要找出位置。

由于字符串只包含小写字母,因此,建立两个长度为26的数组,分别对应26位小写字母。由于只需要求是否存在相应的排列,所以也相当于求包含对应字母的数量是否相等。先把字符串一中各个字母的个数记录于数组一,假设字符串一长度为k,先把字符串二中前k个字符的字母个数情况输入数组二中,然后进行对比,若两个数组相同,则表示字符串二的前k位是字符串一的另一种排列方式或相同。若不相同则表示不是。然后从字符串二的第k+1位开始,逐个添加对应字母的个数,假设为第i位,并减去第i-k的字母,保证数组二中表示的是连续的k个字符的字母个数情况。而且进行两个数组间的对比。

原创粉丝点击