LeetCode 438.Find All Anagrams in a String

public List<Integer> findAnagrams(String s, String p) {
		List<Integer> result = new ArrayList<Integer>();
		//构造P的map
		int[] mapP = new int[26];
		for(int i = 0, len = p.length(); i < len; i++) {
			mapP[p.charAt(i) - 'a']++;
		}
		
		int[] mapS = new int[26];
		int begin = 0;
		for(int i = 0, len = s.length(); i < len; i++) {
			mapS[s.charAt(i) - 'a']++;
			if(isWindowOK(mapS, mapP)) {
				result.add(begin);
				mapS[s.charAt(begin) - 'a']--;
				begin++;
			} else if(mapP[s.charAt(i) - 'a'] == 0){
				while(begin <= i) {
					mapS[s.charAt(begin) - 'a']--;
					begin++;
				}
			} else if(i - begin == p.length() - 1) {
				mapS[s.charAt(begin) - 'a']--;
				begin++;
			}
		}
		
		return result;
	}
	
	public boolean isWindowOK(int[] mapS, int[] mapP) {
		for(int i = 0; i < 26; i++) {
			if(mapS[i] != mapP[i]) {
				return false;
			}
		}
		return true;
	}

这题的关键点:

1.双指针维护区间,条件是区间内的字符串与子串的字符序列相同,即不看顺序,只要字符串有相同字符且字符个数相同就行。这样我们就可以利用map数组纪录字符个数,再比较数组。

2.当区间字符串的字符在子串未出现,或者区间字符串的长度等于子串长度但不满足相同字符且字符个数相同,或者区间满足条件时,begin才开始移动,并且移动过程中把begin位置字符从mapS中减去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值