# 567.M 字符串的排列

> Problem: [567. 字符串的排列](https://leetcode.cn/problems/permutation-in-string/description/)

## 思路

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

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

## Code

```go
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
}
```
