
767 重构字符串(大根堆--贪心)
统计字符频率。 检查最大频率是否超过允许值。 初始化大根堆,以处理字符频率。 每次取出两个最高频率字符,分散排列。 构建结果字符串,处理奇数长度情况。 统计字符频率: 使用字典记录每个字符的出现次数。 检查可行性: 确定最大频率是否超过允许值,如果超过,直接返回空字符串。 初始化堆: 将字符频率和字符存储为元组,使用负数形成大根堆。 构造结果字符串: 每次从堆中取出两个字符,分散排列,直到堆为空或剩一个字符。 处理奇数长度: 如果字符串长度为奇数,添加最后一个字符到结果中。
发布日期:2021-05-07 21:56:25
浏览次数:18
分类:精选文章
本文共 1859 字,大约阅读时间需要 6 分钟。
解决方案:判断是否能重新排布字符串中的字母,使得相邻字符不同。可用大根堆贪心算法构造结果。
步骤解释:
代码实现:使用Python的heapq模块,大根堆通过负数实现。
重新排布字符串中的字符
步骤解释:
代码实现:
import collectionsimport heapqclass Solution: def reorganizeString(self, S: str) -> str: if len(S) < 2: return S # 统计字符频率 char_count = collections.defaultdict(int) for c in S: char_count[c] += 1 # 确定最大频率 max_freq = max(char_count.values()) if max_freq > (len(S) + 1) // 2: return "" # 初始化大根堆,存储负数频率和字符 heap = [(-freq, char) for char, freq in char_count.items()] heapq.heapify(heap) result = [] while len(heap) > 1: # 取出两个字符 freq1, char1 = heapq.heappop(heap) freq2, char2 = heapq.heappop(heap) # 增加结果 result.append(char1) result.append(char2) # 减少频率 char_count[char1] -= 1 char_count[char2] -= 1 # 如果频率仍有剩余,重新入堆 if char_count[char1] > 0: heapq.heappush(heap, (-char_count[char1], char1)) if char_count[char2] > 0: heapq.heappush(heap, (-char_count[char2], char2)) # 处理剩下的字符(奇数长度的情况) if heap: result.append(heap[0][1]) return ''.join(result)
代码解释:
- 统计字符频率: 使用
collections.defaultdict
遍历字符串,记录每个字符的出现次数。 - 检查可行性: 计算最大频率,如果超过允许值,返回空字符串。
- 初始化堆: 将频率和字符转换为元组,使用负数构建大根堆,以便使用贪心算法。
- 构造结果字符串: 每次从堆中取出两个字符,减少它们的频率,若频率仍有剩余,再次入堆。
- 处理奇数长度: 当堆中剩下一个字符时,添加到结果中。
通过这种方法,可以高效地判断字符串是否可以重新排列并构造结果。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月31日 17时02分39秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
在没实践机会的前提下,如何跨越级别
2019-03-05
从面试官角度告诉大家如何准备项目方面的描述
2019-03-05
架构师入门:搭建基本的Eureka架构(从项目里抽取)
2019-03-05
Java核心技术及面试指南 流程控制方面的面试题答案
2019-03-05
MongoDB 快速扫盲贴
2019-03-05
修复搜狗、360等浏览器不识别SameSite=None 引起的单点登录故障
2019-03-05
明天要早起,今天不博了。
2019-03-05
2017/08/21 工作日志
2019-03-05
EXTJS4.2——10.Tab+Iframe
2019-03-05
WEB基础——AJAX
2019-03-05
one + two = 3
2019-03-05
Kali Day01 --- arpspoof命令进行断网攻击(ARP欺骗)
2019-03-05
echart关系图平分节点删除时自动平衡问题
2019-03-05
【Coursera】Internet History 读书笔记
2019-03-05
《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考
2019-03-05
Decision tree(决策树)算法初探
2019-03-05
sctf_2019_easy_heap
2019-03-06
StringBuilder拼接字符串,“,”在前还是在后问题
2019-03-06
给asterisk1.8.7添加menuselct选项
2019-03-06