当前位置: 首页 > article >正文

LeetCode 力扣 热题 100道(二十三)找到字符串中所有字母异位词(C++)

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

字母异位词,字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次。

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
                vector<int> result;
        if (s.size() < p.size()) return result;

        // 记录 p 的字符频率
        vector<int> pCount(26, 0), sCount(26, 0);
        for (char c : p) {
            pCount[c - 'a']++;
        }

        // 初始化 s 中的滑动窗口
        for (int i = 0; i < p.size(); ++i) {
            sCount[s[i] - 'a']++;
        }

        // 检查初始窗口是否匹配
        if (sCount == pCount) {
            result.push_back(0);
        }

        // 滑动窗口遍历 s
        for (int i = p.size(); i < s.size(); ++i) {
            // 添加右侧字符
            sCount[s[i] - 'a']++;
            // 移除左侧字符
            sCount[s[i - p.size()] - 'a']--;
            
            // 检查当前窗口是否匹配
            if (sCount == pCount) {
                result.push_back(i - p.size() + 1);
            }
        }

        return result;
    }
};

使用一个固定大小的窗口遍历字符串 s

在每一步中,检查窗口内的字符计数是否与字符串 p 的字符计数匹配。

如果匹配,则记录当前窗口的起始索引。

使用两个计数器来高效地更新滑动窗口,避免重复计算。

字符计数pCountsCount 用于存储 p 和当前窗口的字符频率。每个频率数组大小为 26(对应字母 a-z)。

初始窗口设置:初始化 sCounts 中前 p.size() 个字符的频率。

滑动窗口更新

每次窗口向右滑动一个字符。

添加新字符到窗口中,同时移除窗口最左边的字符。

窗口匹配检查:每次更新窗口后检查 sCount 是否等于 pCount,相等时记录窗口的起始索引。


http://www.kler.cn/a/466766.html

相关文章:

  • 【ArcGIS Pro二次开发实例教程】(1):图层的前置、后置
  • 云打印之菜鸟打印组件交互协议
  • java并发之AQS
  • JAVA类和对象练习
  • YIG带通滤波器
  • 如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?
  • issue问题全解
  • 从摩托罗拉手机打印短信的简单方法
  • 深入 Redis:高级特性与最佳实践
  • 下载Stegsolve.jar后运行报错 ”Error: Unable to access jarfile stegslove. ”
  • Hive分区表添加字段
  • 设计模式-创建型设计模式总结
  • 数据库原理与应用期末复习
  • leetcode 面试经典 150 题:同构字符串
  • 创建基于PHP的多接口MD5解密工具
  • 【视频配音加字幕】—— 让每一帧画面都“发声”!
  • 无刷直流电机偏移角度
  • 如何使用简单的方法在Mac计算机上打开 HEIC 文件
  • 每天10分钟学习Netty——基础入门1:Hello,NettyServer
  • JAVA学习笔记_JVM
  • Leetcode3046:分割数组
  • 学习笔记:Diffusion Model的理论推导和代码
  • 基于CentOS的Docker + Nginx + Gitee + Jenkins部署总结
  • 树莓派5-yolo5部署
  • OJ随机链表的复制题目分析
  • 【机器学习】机器学习基础与入门:从零开始的全面学习指南