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题目,重构按照奇偶隔开即可, 可以使用堆,也可以自定义排序后再重排