utils.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package main
  2. func minInt(nums ...int) int {
  3. min := nums[0]
  4. for i := 1; i < len(nums); i++ {
  5. if nums[i] < min {
  6. min = nums[i]
  7. }
  8. }
  9. return min
  10. }
  11. func nextPerm(nums []int) bool {
  12. n := len(nums)
  13. if n < 2 {
  14. return false
  15. }
  16. i := n - 2
  17. for ; 0 <= i && nums[i+1] <= nums[i]; i-- {
  18. }
  19. if i == -1 {
  20. return false
  21. }
  22. j := i + 1
  23. for ; j+1 < n && nums[i] < nums[j+1]; j++ {
  24. }
  25. nums[i], nums[j] = nums[j], nums[i]
  26. for l, r := i+1, n-1; l < r; l, r = l+1, r-1 {
  27. nums[l], nums[r] = nums[r], nums[l]
  28. }
  29. return true
  30. }
  31. func countGroup(s string, perm []int) int {
  32. n, k := len(s), len(perm)
  33. prevByte := s[perm[0]]
  34. cnt := 1
  35. for offset := 0; offset < n; offset += k {
  36. i := 0
  37. if offset == 0 {
  38. i = 1
  39. }
  40. for ; i < k; i++ {
  41. if s[offset+perm[i]] != prevByte {
  42. cnt++
  43. }
  44. prevByte = s[offset+perm[i]]
  45. }
  46. }
  47. return cnt
  48. }
  49. func slowSolution(s string, k int) (min int) {
  50. perm := make([]int, k)
  51. for i := range perm {
  52. perm[i] = i
  53. }
  54. min = countGroup(s, perm)
  55. for nextPerm(perm) {
  56. groupCnt := countGroup(s, perm)
  57. if groupCnt < min {
  58. min = groupCnt
  59. }
  60. }
  61. return
  62. }