395.longest-substring-with-at-least-k-repeating-characters.go 690 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. func longestSubstring(s string, k int) (max int) {
  2. freq, ban := make([]int, 256), make([]bool, 256)
  3. for _, r := range s {
  4. freq[r]++
  5. }
  6. cnt := 0
  7. for i := 'a'; i <= 'z'; i++ {
  8. if 0 < freq[i] && freq[i] < k {
  9. cnt++
  10. ban[i] = true
  11. }
  12. }
  13. n := len(s)
  14. if cnt == 0 { // No rune is forbidden, return n
  15. return n
  16. }
  17. beg := 0
  18. for i, r := range s {
  19. if ban[r] { // Split s into substrings using forbidden runes, then find the longest
  20. if k <= i-beg {
  21. max = maxInt(max, longestSubstring(s[beg:i], k))
  22. }
  23. beg = i + 1
  24. }
  25. }
  26. if k <= n-beg {
  27. max = maxInt(max, longestSubstring(s[beg:n], k))
  28. }
  29. return
  30. }
  31. func maxInt(x, y int) int {
  32. if x < y {
  33. return y
  34. }
  35. return x
  36. }