func longestSubstring(s string, k int) (max int) {
	freq, ban := make([]int, 256), make([]bool, 256)
	for _, r := range s {
		freq[r]++
	}
	cnt := 0
	for i := 'a'; i <= 'z'; i++ {
		if 0 < freq[i] && freq[i] < k {
			cnt++
			ban[i] = true
		}
	}
	n := len(s)
	if cnt == 0 { // No rune is forbidden, return n
		return n
	}
	beg := 0
	for i, r := range s {
		if ban[r] { // Split s into substrings using forbidden runes, then find the longest
			if k <= i-beg {
				max = maxInt(max, longestSubstring(s[beg:i], k))
			}
			beg = i + 1
		}
	}
	if k <= n-beg {
		max = maxInt(max, longestSubstring(s[beg:n], k))
	}
	return
}

func maxInt(x, y int) int {
	if x < y {
		return y
	}
	return x
}