1234567891011121314151617181920212223242526272829303132333435363738 |
- 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
- }
|