首页 > 编程语言 >【C++习题】14.滑动窗口_找到字符串中所有字母异位词

【C++习题】14.滑动窗口_找到字符串中所有字母异位词

时间:2024-11-26 23:32:19浏览次数:8  
标签:count 字符 right 14 ++ C++ hash1 hash2 习题

文章目录


题目链接:

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


题目描述:

768c1cb105db920f4a438da0e3135f4d


解法

暴力解法:

字母排序后运用滑动窗口解题。

滑动窗口+哈希表:

083e1fe9a56c3bdfc0f77ae19859c75a

我们可以优化一下,比如下面cbabae,实际上只是把c去掉,加上一个e,没必要三个全删。

0e634a75ca56de9fb1f91b5d72b28b68

  1. left=0,right=0
  2. 进窗口
  3. 判断,出窗口
  4. 更新结果

C++ 算法代码:

class Solution 
{
    public:
    vector<int> findAnagrams(string s, string p) 
    {
        vector<int> ret;
        int hash1[26] = { 0 }; // 统计字符串 p 中每个字符出现的个数
        for(auto ch : p) hash1[ch - 'a']++;//遍历字符串 p,对每个字符出现的次数进行统计
        int hash2[26] = { 0 }; // 统计窗口里面的每一个字符出现的个数
        int m = p.size();//窗口大小
        for(int left = 0, right = 0, count = 0; right < s.size(); right++)
        {
            char in = s[right];
            // 进窗口 + 维护 count
            //++hash2[in - 'a'] 先将 hash2[in - 'a'] 的值增加1,然后检查是否小于等于 hash1[in - 'a']。
			//如果 hash2[in - 'a'] 的值小于等于 hash1[in - 'a'],说明这个字符在 p 中出现次数至少与 s 中当前字符出现次数相同,
            //说明这是一个有效的匹配字符,count 增加。
            //如果s[right]是p里面没有的字母,那么++hash2[in - 'a']=2,hash1[in - 'a']=1,不满足条件
            //如果s[right]是p里面出现1次的字母,那么++hash2[in - 'a']=2,hash1[in - 'a']=2,满足条件
            //如果s[right]是p里面出现2次的字母,那么++hash2[in - 'a']=3,hash1[in - 'a']=3,满足条件
            if(++hash2[in - 'a'] <= hash1[in - 'a']) 
            {
                count++; //count 用于记录当前窗口中有效字符的数量(即与 p 中字符匹配的字符数量)
            }
            if(right - left + 1 > m) // 判断窗口大小超过 m 时,调整窗口
            {
                char out = s[left++];
                // 出窗口 + 维护 count
                //更新 hash2,如果移除后 hash2[out - 'a'] 的值小于等于 hash1[out - 'a'],说明移除的是一个有效匹配字符,count 减少。
               // hash2[out - 'a']-- 先检查 hash2 中对应字符的计数是否小于等于 hash1,然后再将 hash2 中对应字符的计数减少1。
				//如果 hash2 的计数小于等于 hash1,说明移除的字符是一个有效的匹配字符,count 减少。
                if(hash2[out - 'a']-- <= hash1[out - 'a']) 
                {
                    count--;
                }
            }
            // 更新结果
            //当 count 等于 m 时,说明当前窗口是一个字母异位词,记录起始索引 left
            if(count == m) 
            {
                ret.push_back(left);
            }
        }
        return ret;
    }
};

图解

例如:s = "cbaebabacd", p = "abc"

  1. hash1[a]=1,hash1[b]=1,hash1[c]=1,m=3

    in=s[right]=c++hash2[in - 'a']=2,hash[in - 'a']=2

    满足条件count++;right++

bdd347e8c37a414fe61745102a78957b

  1. in=s[right]=b++hash2[in - 'a']=2,hash[in - 'a']=2

    满足条件count++;right++

7e03749d00429fde60ecea87b5608723

  1. in=s[right]=a++hash2[in - 'a']=2,hash[in - 'a']=2

    满足条件count++;right++

39834c43a4c768ab0307c2003fd2e0f2

  1. in=s[right]=e,窗口大小超过 m ,调整窗口out=s[left++]=e++hash2[in - 'a']=2,hash[in - 'a']=1,不满足条件无法count++

    ,满足条件count--;right++

c8e5fd21bc427d364a739b58bd87dd1e

  1. 依此类推

标签:count,字符,right,14,++,C++,hash1,hash2,习题
From: https://blog.csdn.net/hlyd520/article/details/144043488

相关文章

  • C++中的NULL和nullptr
    NULL 和 nullptr 都是用于表示空指针的常量,但它们在C++中有一些重要的区别,特别是随着C++11引入了 nullptr 之后,nullptr 成为了更推荐的选择。以下是两者的主要区别:1.类型NULL:在C和C++中,NULL 是一个宏,通常定义为 0(或 (void*)0),它本质上是整数常量。由于它是......
  • C++中单例模式和static的对比
    在编程中,单实例(Singleton)模式和使用 static 变量或方法 都能实现某些程度上的共享状态或限制实例数量,但它们的设计目的、适用场景以及实现方式存在本质区别。1.单实例(Singleton)模式特点:目标:确保一个类在全局范围内只有一个实例,并提供一个访问该实例的全局访问点。控制粒......
  • 【C++编程】五个分区: 堆、栈、静态(全区)区、 常量区 代码区
    在C++中,程序的内存管理被分为几个区域,这些区域每个都有其特定的用途。下面是你提到的五个分区的详细描述:一、栈区(Stack)用途:用于存储局部变量和函数调用时的上下文(如返回地址与参数等)。特点:采用先进后出(LIFO)原则进行管理。内存由编译器自动分配和释放,程序员无法手动干预。栈......
  • 习题9.2
    点击查看代码importnumpyasnpimportpandasaspdimportscipy.statsasssimportstatsmodels.apiassmimportmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['TimesNewRoman+SimSun+WFMSansSC']plt.rcParams['mathtext.......
  • 习题9.3
    点击查看代码importnumpyasnpimportpandasaspdimportstatsmodels.apiassmimportmatplotlib.pyplotasplt#读取数据df=pd.read_excel('F:\python数学建模与算法\第九章习题\hm9.3.xlsx',header=None)#清理数据df=df.apply(pd.to_numeric,errors='coe......
  • Ollma本地部署Qwen2.5 14B(不使用docker)
    部署机器硬件情况:内存:32GB显卡:3060 为什么不使用docker:1.网上教程大多以docker为主2.安装docker的时间太长,在等待的时候顺便尝试一下不用docker的部署1.安装Ollama下载地址:Ollama下载好之后默认安装即可。Ollama常用命令【跟docker差不多,初次安装的话这边可以......
  • 最长回文字串习题分析
    习题:(leetcode5)给你一个字符串 s,找到 s 中最长的 回文子串。回文字串:子字符串 是字符串中连续的 非空 字符序列。分析:可以先创建一个回文判断函数(isPalindrome),对于一个回文字串将第一个元素和最后一个元素删去后剩余的字串仍是回文字串。使用双重循环进行遍历,找到......
  • 三数之和习题分析
    习题:(leetcode15)给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]==0。请你返回所有和为0且不重复的三元组。注意:答案中不可以包含重复的三元组。分析:此题使用排序+双指......
  • Ollma本地部署Qwen2.5 14B(不使用docker)
    部署机器硬件情况:内存:32GB显卡:3060为什么不使用docker:1.网上教程大多以docker为主2.安装docker的时间太长,在等待的时候顺便尝试一下不用docker的部署1.安装Ollama下载地址:https://ollama.com/下载好之后默认安装即可。Ollama常用命令【跟docker差不多,初次安装的话......
  • 洛谷P1478(洛谷P1223)
    因为这两题相似,把它们放在一个博客里面发了陶陶摘苹果(升级版)-洛谷陶陶摘苹果(升级版)题目描述又是一年秋季时,陶陶家的苹果树结了n个果子。陶陶又跑去摘苹果,这次他有一个a公分的椅子。当他手够不着时,他会站到椅子上再试试。这次与NOIp2005普及组第一题不同的是:陶陶之前搬......