算法数据结构---哈希表练习1

本篇主要是在学习哈希表结构时,对一些习题的练习。

题目来源于力扣438. 找到字符串中所有字母异位词

请添加图片描述

如下论述和代码,我们均假设两个字符串s = "cbaebabacd", p = "abc",进行探究。

此题我们的思路可以是如下:

(1)首先对p字符串中出现的各个字母出现的次数做统计,用一个整型数组存储

(2)定义一个新的整型数组,用于存储s字符串中子串每个字母出现的次数;借助滑动窗口的思想,分别定义左右指针,初始时索引均为0,右指针循环向后移动,并更新数组,直到左右指针之间的子串长度与p字符串长度相等时,比较两个数组是否相等,若相等,将左指针添加到索引列表中,同时再次更新数组,进行下一次循环

大体上的执行过程如下:

请添加图片描述

`
根据如上思想,可以编写代码如下:

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        //如果s字符串长度比p还小 
        if(s.length()<p.length()){
            return new ArrayList<Integer>();
        }
        //count数组存储p字符串每个字母出现的次数
        int[] count=new int[26];
        for (int i=0;i<p.length();i++){
            count[p.charAt(i)-'a']++;
        }

        //s="cbaebabacd"  p="abc"
		//定义左指针
        int left=0;
        //定义s_count数组存储s字符串中每个字母出现的次数,动态更新
        int[] s_count=new int[26];
        //存放子串匹配的索引
        ArrayList<Integer> arr = new ArrayList<>();
        
        //定义右指针
        for(int right=0;right<s.length();right++){
            s_count[s.charAt(right)-'a']++;
            //当子串长度和p字符串长度相等时,比较count和s_count数组是否相等
            if (right-left+1 == p.length()){
                if(Arrays.equals(count,s_count)){
                //数组相等,则向arr数组添加子串的起始索引
                    arr.add(left);
                }
                //添加完后,由于左指针要向右滑动,需要把左指针处的字母出现次数-1,以免影响后续比较
                s_count[s.charAt(left)-'a']--;
                left++;
            }
        }
        return arr;

    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丷江南南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值