
leetcode题解767-重构字符串
统计每个字符的出现次数。 检查是否存在超过maxAllowed出现次数的字符。若有,返回空字符串。 初始化一个最大堆,按字符出现次数降序排列。 从堆中取出两个字符,拼接到结果字符串中,并更新他们的出现次数。 重复上述步骤,直到堆中剩下一个字符或为空。 统计字符频率:我们首先遍历字符串S,统计每个字符的出现次数,存储在数组 检查是否可行:计算字符串长度为n的最大允许出现次数 初始化最大堆:使用 构造结果字符串:从堆中取出两个字符,拼接到结果字符串中,并更新它们的出现次数。重复这个过程,直到堆中剩下一个字符或为空。最后处理剩下的字符,确保结果字符串满足条件。
发布日期:2025-04-05 06:23:34
浏览次数:8
分类:精选文章
本文共 2228 字,大约阅读时间需要 7 分钟。
重新排布字符串的方法
给定一个字符串S,我们需要检查是否能重新排布其中的字母,使得相邻的字符都不相同。如果可以,输出任意一个满足条件的结果;如果不可能,则返回空字符串。
方法思路
为了确定是否可以重新排布字符串,我们需要检查每个字符的出现次数是否超过允许的最大值。根据字符串的长度n,最大允许的出现次数为:
- 当n是偶数时,maxAllowed = n / 2
- 当n是奇数时,maxAllowed = (n + 1) / 2
如果有任何一个字符的出现次数超过maxAllowed,那么就无法重新排布字符串。
如果所有字符的出现次数都在允许范围内,可以使用贪心算法通过最大堆来构造满足条件的字符串。具体步骤如下:
代码实现
import java.util.PriorityQueue;import java.util.Comparator;public class Solution { public String reorganizeString(String S) { final int[] alpha = new int[26]; int len = S.length(); for (int i = 0; i < len; i++) { char ch = S.charAt(i); alpha[ch - 'a']++; } int maxOccur = 0; for (int i = 0; i < 26; i++) { if (alpha[i] > maxOccur) { maxOccur = alpha[i]; } } int maxAllowed = (len + 1) / 2; if (maxOccur > maxAllowed) { return ""; } PriorityQueuequeue = new PriorityQueue<>(new Comparator () { @Override public int compare(Character o1, Character o2) { return alpha[o2 - 'a'] - alpha[o1 - 'a']; } }); for (int i = 0; i < 26; i++) { if (alpha[i] > 0) { queue.offer((char) ('a' + i)); } } StringBuilder result = new StringBuilder(); while (queue.size() > 1) { char ch1 = queue.poll(); char ch2 = queue.poll(); result.append(ch1); result.append(ch2); alpha[ch1 - 'a']--; alpha[ch2 - 'a']--; if (alpha[ch1 - 'a'] > 0) { queue.offer(ch1); } if (alpha[ch2 - 'a'] > 0) { queue.offer(ch2); } } if (queue.size() > 0) { result.append(queue.poll()); } return result.toString(); }}
代码解释
alpha
中。maxAllowed
,如果有任何字符的出现次数超过该值,直接返回空字符串。PriorityQueue
,按字符出现次数降序排列,确保总是先处理出现次数最多的字符。发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月20日 05时02分23秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LESS 中的变量有什么作用?如何声明和使用变量?
2025-04-05
Less 日常用法
2025-04-05
Lettuce 移动框架 for Romantic
2025-04-05
let、const、var的四点区别( 代码示例 )
2025-04-05
LexPredict法律词典项目教程
2025-04-05
LF.73.Combinations Of Coins
2025-04-05
LFS最终幻想
2025-04-05
lftp命令详解
2025-04-05
lib/libstdc++.so.6: version `GLIBCXX_3.4.30‘ not found (required by /lib/x86_64-linux-gnu/libLLVM-15
2025-04-05
libcurl 发送邮件_C++ 邮件推送 (smtp+libcurl+openssl)
2025-04-05
Libevent 事件管理和添加事件
2025-04-05
libevent-简单的定时器
2025-04-05
libevent在windows下使用步骤详解
2025-04-05
Libevent源码分析(一):最小堆
2025-04-05
libgdx的菜单配置,以及json文件的结构
2025-04-05
libiconv字符集转换库在C#中的使用
2025-04-05
liblognorm编译
2025-04-05
libmpg123 解码库用法
2025-04-05
Library Module上传Jcenter详解
2025-04-05