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

【LeetCode】438.找到字符串中所有的字母异位词

目录

  • 题目
    • 题目要求
      • 什么是“异位词”?
      • 如何快速判断两个字符串是否是“异位词”?
    • 解法 滑动窗口 + 哈希表 (统计个数)
      • 核心思路
      • 具体步骤
    • 代码

题目

题目链接:LeetCode-438题

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

题目要求

  1. 异位词 的子串
  2. 起始索引

什么是“异位词”?

异位词是指两个字符串的字符组成完全相同,但字符的顺序可以不同。例如,“abc” 和 “bca” 是异位词,而 “abc” 和 “abd” 不是。

如何快速判断两个字符串是否是“异位词”?

我们可以通过统计两个字符串中每个字符的个数来判断它们是否是异位词。如果两个字符串的字符统计结果完全相同,则它们是异位词。
利用哈希表来实现。
在这里插入图片描述

解法 滑动窗口 + 哈希表 (统计个数)

核心思路

  1. 滑动窗口:在字符串 s 上维护一个固定大小的窗口,窗口的大小等于字符串 p 的长度。

  2. 哈希表统计:使用哈希表统计窗口内字符的个数,并与 p 的字符统计结果进行比较。

  3. 优化:通过变量 count 统计窗口中“有效字符”的个数,避免每次比较整个哈希表。

优化:
利用变量count来统计窗口中“有效字符”的个数

  • 进窗口的字符,这个字符所对应的数如果<=对应p串对应字符的个数,则为有效字符,count++
  • 出窗口的字符,如果字符对应的数在出去之前>对应p串对应的字符的个数,则为无效字符,若为有效字符,count–;

具体步骤

  1. 初始化:
    • 统计字符串 p 的字符个数,存入哈希表 hashp。
    • 初始化滑动窗口的左边界 left = 0,右边界 right = 0。
    • 初始化变量 count,用于统计窗口中“有效字符”的个数。
  2. 滑动窗口:
    • 右边界 right 向右移动,将字符 s[right] 加入窗口,并更新哈希表 hashs。
    • 如果当前字符 s[right] 的个数不超过 p 中对应字符的个数,则 count++(表示这是一个有效字符)。
    • 如果窗口大小超过 p 的长度,则左边界 left 向右移动,将字符 s[left] 移出窗口,并更新哈希表 hashs。
    • 如果移出的字符 s[left] 的个数不超过 p 中对应字符的个数,则 count–(表示移出了一个有效字符)。
  3. 更新结果:
    • 如果 count 等于 p 的长度,说明当前窗口是一个异位词子串,记录起始索引 left。

代码

class Solution {
public:
    unordered_map<char,int> hashp;
    unordered_map<char,int> hashs;
    vector<int> ret;
    vector<int> findAnagrams(string s, string p) {
        //统计p
        for(auto ch : p)
        {
            hashp[ch] ++;
        }

        //滑动窗口
        int left = 0,right = 0;
        
        int count = 0;
        int m = p.size();
        for(right;right < s.size();right++)
        {
            char in = s[right];

            //进入窗口
            hashs[in] ++;  
            //判断是否是有效字符,维护count
            if(hashs[in]<=hashp[in]) count++; 

            if(right - left + 1 > m) 
            {
                //出窗口
                char out = s[left];
                left++;
                
                //判断是否是有效字符,维护count
                if(hashs[out]<=hashp[out]) count--;
                hashs[out]--;
            } 

            //更新结果
            if(count == m) ret.push_back(left);
        }

        return ret;
    }
};

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

相关文章:

  • 请解释设备像素、CSS 像素、设备独立像素、DPR、PPI 之间的区别?
  • 详解如何使用Pytest内置Fixture tmp_path 管理临时文件
  • Redis之持久化
  • VUE3环境搭建
  • 【iOS】SwiftUI状态管理
  • Kotlin 2.1.0 入门教程(十八)函数式接口
  • AI与SEO协同:智能关键词挖掘与精准部署策略
  • 2025年前端工程师职业发展的系统性应聘规划
  • 深度学习(1)-简单神经网络示例
  • 【力扣】98.验证搜索二叉树
  • 2025 N1CTF crypto 复现
  • linux-5.10.110内核源码分析 - bcm2711 pcie BAR地址分配
  • Vue 3 30天精进之旅:Day 26 - SSR与Nuxt.js
  • Linux、Docker与Redis核心知识点与常用命令速查手册
  • haproxy实现MySQL服务器负载均衡
  • 用队列实现栈
  • pycharm上传github问题:rejected
  • 基于fastadmin快速搭建导航站和API接口站点系统源码
  • 【VB语言】EXCEL中VB宏的应用
  • SpringMVC的工作原理