567.M 字符串的排列

Problem: 567. 字符串的排列

思路

先用count记录s1中每个字符的数量(负数),然后用leftright维护一个滑动窗口,每次右边界移动时,把右边界对应字符的数量加一,如果该字符的数量大于0,则意味着该字符不包含在s1中,或者该字符的数量已经多于s1中该字符的数量,因此一直左移窗口,直到该字符数量恢复为0。

每移动一轮窗口后,检查窗口大小是否与s1长度相同,是则找到了该字符串的排列。

Code

func checkInclusion(s1 string, s2 string) bool {
	if len(s1) > len(s2) {
		return false
	}

	count := [26]int{}
	for _, ch := range s1 {
		count[ch-'a']--
	}

	left := 0
	for right, ch := range s2 {
		count[ch-'a']++
		for count[ch-'a'] > 0 {
			count[s2[left]-'a']--
			left++
		}

		if right-left+1 == len(s1) {
			return true
		}
	}

	return false
}

Last updated

Was this helpful?