123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package main
- func minInt(nums ...int) int {
- min := nums[0]
- for i := 1; i < len(nums); i++ {
- if nums[i] < min {
- min = nums[i]
- }
- }
- return min
- }
- func nextPerm(nums []int) bool {
- n := len(nums)
- if n < 2 {
- return false
- }
- i := n - 2
- for ; 0 <= i && nums[i+1] <= nums[i]; i-- {
- }
- if i == -1 {
- return false
- }
- j := i + 1
- for ; j+1 < n && nums[i] < nums[j+1]; j++ {
- }
- nums[i], nums[j] = nums[j], nums[i]
- for l, r := i+1, n-1; l < r; l, r = l+1, r-1 {
- nums[l], nums[r] = nums[r], nums[l]
- }
- return true
- }
- func countGroup(s string, perm []int) int {
- n, k := len(s), len(perm)
- prevByte := s[perm[0]]
- cnt := 1
- for offset := 0; offset < n; offset += k {
- i := 0
- if offset == 0 {
- i = 1
- }
- for ; i < k; i++ {
- if s[offset+perm[i]] != prevByte {
- cnt++
- }
- prevByte = s[offset+perm[i]]
- }
- }
- return cnt
- }
- func slowSolution(s string, k int) (min int) {
- perm := make([]int, k)
- for i := range perm {
- perm[i] = i
- }
- min = countGroup(s, perm)
- for nextPerm(perm) {
- groupCnt := countGroup(s, perm)
- if groupCnt < min {
- min = groupCnt
- }
- }
- return
- }
|