C++ | Leetcode C++题解之第438题找到字符串中所有字母异位词

题目:

题解:

cpp 复制代码
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;
    }
};
相关推荐
2601_956121971 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
fpcc1 小时前
跟我学C++中级篇——编译期的条件选择
开发语言·c++
ShineWinsu6 小时前
对于C++:C++20中线程、初始化、Lambda与内存视图等特性的解析
c++·c++20
Xin7707 小时前
LeetCode 23.合并 K 个升序链表(分治递归)
leetcode
张张的快乐时光呀!7 小时前
记录使用 MFC 打开文件对话框读取一张图片并做简单的灰度转换算法简单学习过程
c++·mfc
东华万里8 小时前
第41篇 C++类与对象核心知识梳理:从底层原理到面试实战
开发语言·c++·大学生专区
qq_589666059 小时前
C语言、C++与C#的区别详解
c语言·c++·c#
万法若空9 小时前
排列组合恒等式
c++·算法
Nil2089 小时前
leetcode 105从前序和中序遍历序列构造二叉树
算法·leetcode·职场和发展
老洋葱Mr_Onion10 小时前
【C++】CSP-J初赛模拟卷七错题整理(作者自用)
c++·算法·深度优先