滑动窗口

说起滑动窗口,第一个能想到的是tcp协议中的滑动窗口(Sliding window)。

tcp协议中,通常将滑动窗口用于一种流量控制。通常发送方或者接收方将数据包缓存起来,然后通过滑动窗口来控制需要发送或者接受数据包的数量或大小。 以此来改变吞吐量。

在算法中,滑动窗口也是类似的原理,需要维护一个数组/队列(可以看做tcp中缓存),然后不断的滑动窗口来计算结果。

例如1876、长度为三且各字符不同的子字符串

对于这题,只需要维护一个大小为3的窗口,比较窗口内的字符各不相同即可。

首先准备大小为3的窗口,即i ,i + 1,i + 2为窗口,并且对其值进行比较,如果不相等,符合条件的结果加一。

func countGoodSubstrings(s string) (ans int) {
	for i := 0; i <= len(s)-3; i++ {
		if s[i] != s[i+1] && s[i+1] != s[i+2] && s[i] != s[i+2] {
			ans++
		}
	}
	return ans
}

需注意终止条件需要到len(s)-3,否则将会越界。

这样我们即可通过n的复杂度解决问题了。

简单题:

参考:

Tip

此方法或数据结构有更多算法实例,请点击滑动窗口 查看更多