go去掉字符串最后一个字符_leetcode767_go_重构字符串

leetcode767_重构字符串

01

题目

给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。

若可行,输出任意可行的结果。若不可行,返回空字符串。

示例 1:输入: S = "aab" 输出: "aba"

示例 2:输入: S = "aaab" 输出: ""

注意: S 只包含小写字母并且长度在[1, 500]区间内。

02

解题思路分析

1、堆;时间复杂度O(nlog(n)),空间复杂度O(n)

func reorganizeString(S string) string {  n := len(S)  if n <= 1 {    return S  }  res := make([]byte, 0)  m := make(map[byte]int)  for _, v := range S {    m[byte(v)]++  }  nodeHeap := &Heap{}  heap.Init(nodeHeap)  for k, v := range m {    if v > (n+1)/2 {      return ""    }    heap.Push(nodeHeap, Node{      char: k,      num:  v,    })  }  for nodeHeap.Len() >= 2 {    node1 := heap.Pop(nodeHeap).(Node)    node2 := heap.Pop(nodeHeap).(Node)    res = append(res, node1.char, node2.char)    node1.num--    node2.num--    if node1.num > 0 {      heap.Push(nodeHeap, node1)    }    if node2.num > 0 {      heap.Push(nodeHeap, node2)    }  }  if nodeHeap.Len() > 0 {    t := heap.Pop(nodeHeap).(Node)    res = append(res, t.char)  }  return string(res)}type Node struct {  char byte  num  int}type Heap []Nodefunc (h Heap) Len() int {  return len(h)}func (h Heap) Less(i, j int) bool {  return h[i].num > h[j].num}func (h Heap) Swap(i, j int) {  h[i], h[j] = h[j], h[i]}func (h *Heap) Push(x interface{}) {  *h = append(*h, x.(Node))}func (h *Heap) Pop() interface{} {  value := (*h)[len(*h)-1]  *h = (*h)[:len(*h)-1]  return value}

2、自定义排序;时间复杂度O(nlog(n)),空间复杂度O(n)

func reorganizeString(S string) string {  arr := make([]node, 26)  maxCount := 0  for _, char := range S {    index := char - 'a'    arr[index].char = char    arr[index].num++    if arr[index].num > maxCount {      maxCount = arr[index].num    }  }  if maxCount > (len(S)+1)/2 {    return ""  }  sort.Slice(arr, func(i, j int) bool {    return arr[i].num >= arr[j].num  })  res := make([]rune, len(S))  var index int  // 先偶后奇  for i := 0; i < 2; i++ {    for j := i; j < len(S); j = j + 2 {      if arr[index].num == 0 {        index++      }      res[j] = arr[index].char      arr[index].num--    }  }  return string(res)}

03

总结

Medium题目,重构按照奇偶隔开即可, 可以使用堆,也可以自定义排序后再重排

0bec898d5aa8b54f8149b5c3187bd573.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值