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

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

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

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

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

思路

其实也类似于双指针, 使用了字母值为下标的双数组进行比较, 如果区间内的所有字母每个类型都不大于目标字母, 并且区间与目标长度相同, 即判定为相同

Code

func findAnagrams(s string, p string) []int {
	// 将p保存到数组
	result := make([]int, 0)
	pArray := [26]int{}
	sArray := [26]int{}
	for _, v := range p {
		pArray[v-'a']++
	}

	start, end := 0, 0
	for end < len(s) {
		// 将字母逐个加入数组
		sArray[s[end]-'a']++
		// 判断当前的空间是否符合p
		if sArray[s[end]-'a'] > pArray[s[end]-'a'] {
			// 出现了不符合的情况 比如需要1个s 但是现在空间中有两个s
			// 减去一个s
			for s[start] != s[end] {
				sArray[s[start]-'a']--
				start++
			}
			// 直到找到s, 从数组中--
			sArray[s[start]-'a']--
			start++
		}
		// 再判断长度
		if end-start+1 == len(p) {
			// 长度符合 进入字符串相同判断 这个字符串相同判断貌似可以省略?
			result = append(result, start)
		}
		end++
	}
	return result
}
posted @ 2024-04-26 14:36  烟熏咸鱼干  阅读(7)  评论(0编辑  收藏  举报