mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-05 00:25:22 +08:00
57 lines
920 B
Go
57 lines
920 B
Go
package leetcode
|
|
|
|
import (
|
|
"sort"
|
|
)
|
|
|
|
func reorganizeString(S string) string {
|
|
fs := frequencySort767(S)
|
|
if fs == "" {
|
|
return ""
|
|
}
|
|
bs := []byte(fs)
|
|
ans := ""
|
|
j := (len(bs)-1)/2 + 1
|
|
for i := 0; i <= (len(bs)-1)/2; i++ {
|
|
ans += string(bs[i])
|
|
if j < len(bs) {
|
|
ans += string(bs[j])
|
|
}
|
|
j++
|
|
}
|
|
return ans
|
|
}
|
|
|
|
func frequencySort767(s string) string {
|
|
if s == "" {
|
|
return ""
|
|
}
|
|
sMap := map[byte]int{}
|
|
cMap := map[int][]byte{}
|
|
sb := []byte(s)
|
|
for _, b := range sb {
|
|
sMap[b]++
|
|
if sMap[b] > (len(sb)+1)/2 {
|
|
return ""
|
|
}
|
|
}
|
|
for key, value := range sMap {
|
|
cMap[value] = append(cMap[value], key)
|
|
}
|
|
|
|
var keys []int
|
|
for k := range cMap {
|
|
keys = append(keys, k)
|
|
}
|
|
sort.Sort(sort.Reverse(sort.IntSlice(keys)))
|
|
res := make([]byte, 0)
|
|
for _, k := range keys {
|
|
for i := 0; i < len(cMap[k]); i++ {
|
|
for j := 0; j < k; j++ {
|
|
res = append(res, cMap[k][i])
|
|
}
|
|
}
|
|
}
|
|
return string(res)
|
|
}
|