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;
    }
};
相关推荐
weixin_445402301 分钟前
模板元编程应用场景
开发语言·c++·算法
s1hiyu5 分钟前
嵌入式C++低功耗设计
开发语言·c++·算法
2401_8414956413 分钟前
【LeetCode刷题】对称二叉树
数据结构·python·算法·leetcode·二叉树··递归
fpcc27 分钟前
跟我学C++中级篇—线程局部存储的底层分析
c++
Cinema KI37 分钟前
C++11(中):可变参数模板将成为重中之重
开发语言·c++
凯子坚持 c39 分钟前
C++基于微服务脚手架的视频点播系统---客户端(2)
开发语言·c++·微服务
柯一梦41 分钟前
STL2--vector的介绍以及使用
开发语言·c++
txinyu的博客41 分钟前
解析muduo源码之 EPollPoller.h & EPollPoller.cc
c++
凯子坚持 c1 小时前
C++基于微服务脚手架的视频点播系统---客户端(3)
开发语言·c++·微服务
寻寻觅觅☆1 小时前
东华OJ-基础题-86-字符串统计(C++)
开发语言·c++·算法