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

力扣链接

官方题解

class Solution {
    
    
public:
    vector<int> findAnagrams(string s, string p) {
    
    
        int sLen = s.size(), pLen = p.size();

        if (sLen < pLen) {
    
    
            return vector<int>();
        }

        vector<int> ans;
        vector<int> count(26);
        for (int i = 0; i < pLen; ++i) {
    
    
            ++count[s[i] - 'a'];
            --count[p[i] - 'a'];
        }

        int differ = 0;
        for (int j = 0; j < 26; ++j) {
    
    
            if (count[j] != 0) {
    
    
                ++differ;
            }
        }

        if (differ == 0) {
    
    
            ans.emplace_back(0);
        }

        for (int i = 0; i < sLen - pLen; ++i) {
    
    
            if (count[s[i] - 'a'] == 1) {
    
      // 窗口中字母 s[i] 的数量与字符串 p 中的数量从不同变得相同
                --differ;
            } else if (count[s[i] - 'a'] == 0) {
    
      // 窗口中字母 s[i] 的数量与字符串 p 中的数量从相同变得不同
                ++differ;
            }
            --count[s[i] - 'a'];

            if (count[s[i + pLen] - 'a'] == -1) {
    
      // 窗口中字母 s[i+pLen] 的数量与字符串 p 中的数量从不同变得相同
                --differ;
            } else if (count[s[i + pLen] - 'a'] == 0) {
    
      // 窗口中字母 s[i+pLen] 的数量与字符串 p 中的数量从相同变得不同
                ++differ;
            }
            ++count[s[i + pLen] - 'a'];
            
            if (differ == 0) {
    
    
                ans.emplace_back(i + 1);
            }
        }

        return ans;
    }
};


  1. 求count数组的过程,如果是我,可能先分别求出两个词频数组,再相减
for(int i=0;i<plen;++i){
    
    
	s_occ[s[i]-'a']++;
	p_occ[p[i]-'a']++;
}
for(int i=0;i<26;++i){
    
    
	count[i]=s_occ[i]-p_occ[i];
}

官方做法,优点:节省空间,无需额外的数组存储词频;节省时间,无需额外的循环计算差值。

 for (int i = 0; i < pLen; ++i) {
    
    
            ++count[s[i] - 'a'];
            --count[p[i] - 'a'];
        }
  1. 向vector中添加元素
    我使用 push_back(),官方使用emplace_back()

  2. differ变量的设置,首先diifer的含义是记录当前窗口与字符串 p 中数量不同的字母的个数,是数量不同的字母个数,这点很妙,windows里面包含5个a,而p里面只有3个a和窗口里面包含4个a盘里面只有3个a对differ的影响是一样的,我只关心字母的词频是否相同,否,differ+1,是,differ-1,而不关心具体的词频差距是多少,因此只有当count在{0,1,-1}这些数字间发生转变时,differ才可能发生变化。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_51312071/article/details/132557148
今日推荐