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

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


文章目录

  • 1.题目
  • 2.思路
  • 3.代码


1.题目

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

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

异位词是指两个字符串除了字母的顺序不同之外,其他都相同

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

2.思路

由于异位词是单词数量相同,顺序不一定相同,先用两个哈希表将俩个字符串装进去,然后判断两个哈希表是否相同,相同就将起始位置0收集,之后用滑动窗口判断要求,将s的有边界加入到哈希表中,将s的左边界移除哈希表,每次移动完后判断两个哈希表是否相等,相等则记录当前的窗口起始位置

3.代码

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> ret;
        unordered_map<char, int> scount, pcount;

        // 初始化p的字符计数
        for (int i = 0; i < p.size(); ++i) {
            pcount[p[i]]++;
        }

        // 初始化s的第一个窗口的字符计数,窗口大小是p的大小
        for (int i = 0; i < p.size(); ++i) {
            scount[s[i]]++;
        }

        // 检查两个初始哈希是否相等
        if (scount == pcount) {
            ret.push_back(0);
        }

        // 开始滑动窗口
        int right = p.size();
        while (right < s.size()) {
            // 新加入窗口的字符
            scount[s[right]]++;

            // 窗口移出的字符
            int left = right - p.size();
            scount[s[left]]--;
            
            // 如果某个字符的计数降为0,则从map中移除该字符
            if (scount[s[left]] == 0) {
                scount.erase(s[left]);
            }

            // 检查当前窗口是否为anagram
            if (scount == pcount) {
                ret.push_back(right - p.size() + 1);
            }

            // 移动窗口
            ++right;
        }

        return ret;
    }
};


http://www.kler.cn/news/326701.html

相关文章:

  • uniapp 知识点
  • 【前端样式】Sweetalert2简单用法
  • 如何使用ssm实现个人日常事务管理系统+vue
  • 金融教育宣传月 | 平安养老险百色中心支公司开展金融知识“消保县域行”宣传活动
  • 心理咨询预约管理系统(含源码+sql+视频导入教程)
  • web前端与koa框架node后端实现分片断点上传
  • xtu oj 六边形
  • 制造企业如何提升项目管理效率?惠科股份选择奥博思PowerProject项目管理系统
  • Windows环境Apache httpd 2.4 web服务器加载PHP8:Hello,world!
  • 【BurpSuite】访问控制漏洞和权限提升 | Access control vulnerabilities (3-6)
  • 一个静态ip可以提取出来多少ip
  • 新版pycharm如何导入自定义环境
  • elasticsearch_exporter启动报错 failed to fetch and decode node stats
  • C语言_回调函数和qsort
  • 全局安装cnpm并设置其使用淘宝镜像的仓库地址(地址最新版)
  • [leetcode] 71. 简化路径
  • 平安养老险肇庆中心支公司开展“2024年金融教育宣传月”活动
  • 【设计模式-模板】
  • k8s StorageClass 存储类
  • 中信银行西安分行开展“担当新使命 消保县域行”金融教育宣传活动
  • 总结之Coze 是一站式 AI Bot 开发平台——工作流使用及coze总结(三)
  • vivado中除法器ip核的使用
  • VS开发 - 静态编译和动态编译的基础实践与混用
  • golang学习笔记23-面向对象(五):多态与断言【重要】
  • C++学习9.24
  • git本地分支落后于远程分支,因此推送被拒绝怎么办?
  • nodejs逐字读取文件示例
  • Python中的`super()`函数:掌握面向对象编程的艺术
  • PHP“===”的意义
  • 工具类:JWT