力扣:438.找到字符串中所有字母异位词

力扣:438.找到字符串中所有字母异位词
题目:
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
代码:

方法①:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int slen = s.size();
        int plen = p.size();
        if(slen < plen) return vector <int>();
        vector <int>pcount(26);
        vector <int>scount(26);
        vector <int>ans;
        for(int i = 0; i < plen; i++){
            ++pcount[p[i]-'a'];
            ++scount[s[i]-'a'];
        }
        if(pcount == scount)   ans.emplace_back(0);
        for(int i = 0 ; i < slen-plen; i++){
            --scount[s[i]-'a'];
            ++scount[s[plen + i]-'a'];
            if(scount == pcount) ans.emplace_back(i+1);
        }
        return ans;
    }
};
for (int i = 0; i < sLen - pLen; ++i) 

可以看做是从 plen 到 slen

 if (sCount == pCount)

容器相等
-——————————————
方法②:

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;
    }
}

两种方法解析:用三个容器,用两个容器。
①:用两个容器表示两个字符串,通过比较容器是否相等判断字符串是否为字母异位词。
②:用一个容器表示两个字符串的综合体,通过 differ 来判断容器中不为 0 的个数。
①过程:首先将 plen 长度的字符串放入容器中,然后①通过容器比较判断是否为字母异位词,将可行位置(0)放入一个容器,然后窗口移动同时随着窗口移动判读昂两容器是否相等,将可行位置放入一个容器。
②过程:首先将 plen 长度的字符串放入容器中,在此之后形成 differ 然后判断differ是否为0,判断是否为字母异位词将可行位置(0)放入一个容器。然后窗口移动同时随着窗口移动改变 differ ,同时判断 differ 是否为0。将可行位置放入一个容器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值