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

63 阅读1分钟

题目:
给定两个字符串 s 和 p,找到 s ****中所有 p ****的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

算法:

方法一:双指针
双指针关键在于如何移动,在何时移动指针

func findAnagrams(s string, p string) []int {
	pCount := make([]int, 26)
	for i := range p {
		pCount[int(p[i] - 'a')] ++
	}

	// 检查curCharCount中各个字符的个数与count中的相同
	var check func(curCharCount []int) bool
	check = func(curCharCount []int) bool {
		for i := range curCharCount {
			if curCharCount[i] != pCount[i] {
				return false
			}
		}
		return true
	}
	ans := make([]int, 0)
	count := make([]int, 26)
	for left, right := 0, 0; right < len(s); right ++ {
		count[int(s[right] - 'a')] ++
		if right - left + 1 < len(p)  {
			continue
		}

		if check(count) {	
			ans = append(ans, left)
		}
		count[int(s[left] - 'a')] --
		left ++
		
	}
	return ans
}