首页 > 编程语言 >(算法)找到字符串中所有字母异位词——<滑动窗⼝+哈希表>

(算法)找到字符串中所有字母异位词——<滑动窗⼝+哈希表>

时间:2024-06-17 22:31:17浏览次数:27  
标签:right int 异位 ++ hash1 哈希 字符串 滑动 left

1. 题⽬链接:438.找到字符串中所有字⺟异位词

2. 题⽬描述:

3. 解法(滑动窗⼝+哈希表): 

算法思路:

◦ 因为字符串p 的异位词的⻓度⼀定与字符串p 的⻓度相同,所以我们可以在字符串s 中构造⼀个⻓度为与字符串p 的⻓度相同的滑动窗⼝,并在滑动中维护窗⼝中每种字⺟的数量; 

◦ 当窗⼝中每种字⺟的数量与字符串p 中每种字⺟的数量相同时,则说明当前窗⼝为字符串p 的异位词;

◦ 因此可以⽤两个⼤⼩为26 的数组来模拟哈希表,⼀个来保存s 中的⼦串每个字符出现的个数,另⼀个来保存p 中每⼀个字符出现的个数。这样就能判断两个串是否是异位词。

C++算法代码: 

#include<iostream> 
#include<string>
#include<vector>
using namespace std;
class Solution
{
public:
    vector<int> findAnagrams(string s, string p)
    {
        int hash1[26] = { 0 };  //记录字符串1子串中元素的出现次数
        int hash2[26] = { 0 };  //记录字符串2中元素的出现次数
        vector<int>vt;  //记录子串的起始索引
        //初始化字符串2中元素的出现次数
        for (int i = 0; i < p.size(); i++)
        {
            hash2[p[i] - 'a']++;
        }
        int left = 0, right = 0;
        int count = 0;    //满足条件的元素数目
        while (right < s.size())
        {
            //如果元素个数满足条件则计数器加1
            if (++hash1[s[right] - 'a'] <= hash2[s[right] - 'a'])
            {
                count++;
            }
            //出窗口
            if (right - left + 1 > p.size())
            {
                //退窗口
                hash1[s[left] - 'a']--;
                //不满足条件了则满足条件数-1
                if (hash1[s[left] - 'a'] < hash2[s[left] - 'a'])
                {
                    count--;
                }
                left++;
            }
            //记录
            //当满足条件数==目标子串大小则记录
            if (count == p.size())
            {
                vt.push_back(left);
            }
            right++;
        }
        return vt;
    }
};

Java算法代码:

class Solution
{
	public List<Integer> findAnagrams(String ss, String pp)
	{
		List<Integer> ret = new ArrayList<Integer>();
		char[] s = ss.toCharArray();
		char[] p = pp.toCharArray();
		int[] hash1 = new int[26]; // 统计字符串 p 中每⼀个字符出现的个数 
		for (char ch : p) hash1[ch - 'a']++;
		int[] hash2 = new int[26]; // 统计窗⼝中每⼀个字符出现的个数 
		int m = p.length;
		for (int left = 0, right = 0, count = 0; right < s.length; right++)
		{
			char in = s[right];
			// 进窗⼝ + 维护 count 
			if (++hash2[in - 'a'] <= hash1[in - 'a']) count++;
			if (right - left + 1 > m) // 判断 
			{
				char out = s[left++];
				// 出窗⼝ + 维护 count 
				if (hash2[out - 'a']-- <= hash1[out - 'a']) count--;
			}
			// 更新结果 
			if (count == m) ret.add(left);
		}
		return ret;
	}
}

标签:right,int,异位,++,hash1,哈希,字符串,滑动,left
From: https://blog.csdn.net/2301_79580018/article/details/139756052

相关文章

  • MD5哈希加密算法
    [TOP]简介MD5(Message-DigestAlgorithm5)是一种被广泛使用的密码散列函数,它可以产生出一个128位(16字节)的散列值(hashvalue),用于确保信息传输完整一致。MD5并不是一种加密算法(因为它不可逆),而是一种摘要算法或哈希算法。以下是MD5加密(更准确地说是哈希)原理的简要概述:说明输入:MD......
  • 滑动窗口总结
    classSolution{public:intminSubArrayLen(inttarget,vector<int>&nums){inti=0;intsum=0;intresult=INT32_MAX;for(intj=0;j<nums.size();j++){sum+=nums[j];while(sum>=tar......
  • 径向滑动轴承动压润滑计算
    根据黄平老师的《润滑数值计算方法》第四章内容,推导径向滑动轴承动压润滑计算方法,并用Matlab将程序复现,最后和书中的计算结果及其论文进行对比。对于等温过程,径向滑动轴承动压润滑的油膜压力分布计算公式为:(1)公式中:R为轴颈半径,单位为m;p为油膜压力,单位为Pa;h为油膜厚度,单位为m;U......
  • Redis是一个高性能的键值对数据库,它支持多种数据结构,如字符串、列表、集合、有序集合
    Redis是一个高性能的键值对数据库,它支持多种数据结构,如字符串、列表、集合、有序集合和哈希表。以下是一些Redis命令的实践示例,帮助你了解如何使用Redis。连接Redis服务器首先,使用redis-cli命令连接到Redis服务器:redis-cli-h<hostname>-p<port>基本命令PING:检查Redis......
  • 轻松实现H5页面下拉刷新:滑动触发、高度提示与数据刷新全攻略
    前段时间在做小程序到H5的迁移,其中小程序中下拉刷新的功能引起了产品的注意。他说到,哎,我们迁移后的H5页面怎么没有下拉刷新,于是乎,我就急忙将这部分的内容给填上。本来是计划使用成熟的组件库来实现,尝试之后发现这些组件和我们H5页面的其他逻辑有冲突(H5还有吸顶、锚点、滑动高亮、......
  • MD5哈希长度延展攻击(选做)
    任务详情任务描述:在一个使用MD5哈希算法的系统中,管理员使用了一个密钥k和命令cmd的组合来生成每个命令的签名:hash(k||cmd)。你已经获得了一个允许查看文件的命令cmd=viewfile和对应的签名h,但你希望通过哈希长度延展攻击,生成一个新的签名,该签名能够让你执行删除文件的命令(删除文......
  • 代码随想录算法训练营第11、12天 | 逆波兰表达式、滑动窗口最大值、前 K 个高频元素
    逆波兰表达式题目https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/逆波兰表达式代码随想录https://programmercarl.com/0150.逆波兰表达式求值.html#其他语言版本滑动窗口最大值https://leetcode.cn/problems/sliding-window-maximum/滑动窗口......
  • 6.14 哈希表
    采用邻接表创建无向图G,依次输出各顶点的度。输入格式:输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数。输入第二行为顶点的信息,每个顶点只能用一个字符表示。依次输入j行,每行输入一条边依附的顶点。输出格式:依次输出各顶点的度,行末没有最后的空格。输入......
  • Q31 LeetCode438 找到字符串中所有字母异位词
    没看懂 1classSolution{2publicList<Integer>findAnagrams(Strings,Stringp){3List<Integer>res=newArrayList<>();4int[]cnt=newint[26];5intn=p.length();6intm=s.length();7......
  • 代码随想录第7天 |● 454.四数相加II●383. 赎金信●15. 三数之和●18. 四数之和●哈
    题目:454.四数相加Ⅱ思路:0.知道用map,但是map存啥1.暴力法,四层循环遍历哈哈哈哈2.分而治之,化繁为简,四个数组a,b,c,d分成两组,题目求符合要求的元祖个数,所以将a+b的值和出现次数存储,之后遍历查找c+d中0-(c+d)出现的次数,统计为结果时间复杂度:O(n^2)空间复杂度:O(n^2),最坏情况下A......