438. Find All Anagrams in a String 寻找字符串种所有的同位串

438. Find All Anagrams in a String 寻找字符串种所有的同位串

先说一下题意,给一个字符串S,和一个模式串P,要求找到所有的P的同位串(Anagram)在S种的起始Index,Anagram的意思就是组成字符相同的字符串。这一道题有很多的解法,有一些时间复杂度比较高,这里我们就不多赘述了,就讲一种比较简单,代码量也不大而且时间复杂度为O(N)的解法。
这一种方法主要是使用了滑动窗口和一个字符哈希数组来解决。

主要思维为:
1.新建一个256的数组用来存放当前窗口内所有的字符的个数。
2. 维护一个count 来表示离匹配一个Anagram还需要多少个字符匹配。
3. 将模式串内所有的字符用数组进行统计
4. 设置一个滑动窗口,左右指针,右指针从S的起始向后滑动,遇到的所有字符都在数组内自减1,如果当前的字符在哈希数组内大于0,则说明当前字符出现在了模式串中,将count减一。
5. 如果当前的count等于0 则说明模式串匹配了,将左指针加入到我们要返回的结果中
6. 如果左右指针的差距等于模式串的长度则说明我们需要移动左指针,如果左指针指向的字符在哈希数组中是负数则说明该字符没有出现在模式串中,但如果非负则说明该字符出现在了模式串中,我们每移出一个出现在模式串中的字符,则需要将count加一。

来让我们看一下java实现吧

class Solution{
	public List<Integer> findAnagrams(String s, String p){
		List<Integer> res = new ArrayList<>();
		int[] hash = new int[256];
		int l = 0,r = 0;
		int count = p.length();
		for(char c:p.toCharArray()){
			hash[c]++;
		}
		while(r < s.length()){
			if(hash[s.charAt(r++)]-- > 0)count--;
			if(count == 0) res.add(l);
			if(r - l == p.length() && hash[s.charAt(l++)]++ >= 0)count++;
		}
		return res;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值