451.sort-characters-by-frequency.go 595 B

123456789101112131415161718192021222324252627
  1. type pairs [][]int
  2. func (ps pairs) Len() int { return len(ps) }
  3. func (ps pairs) Less(i, j int) bool { return ps[j][0] < ps[i][0] }
  4. func (ps pairs) Swap(i, j int) { ps[i], ps[j] = ps[j], ps[i] }
  5. func frequencySort(s string) string {
  6. freq := make([]int, 256)
  7. for _, r := range s {
  8. freq[r]++
  9. }
  10. var ps pairs = make([][]int, 0)
  11. for i := 0; i < 256; i++ {
  12. ps = append(ps, []int{freq[i], i})
  13. }
  14. sort.Sort(ps)
  15. n := len(s)
  16. res := make([]rune, n)
  17. for i, j := 0, 0; i < n; i++ {
  18. for ps[j][0] == 0 {
  19. j++
  20. }
  21. res[i] = rune(ps[j][1])
  22. ps[j][0]--
  23. }
  24. return string(res)
  25. }