358 K 距离间隔重排字符串

给定一个字符串s和整数k,重新排列字符串使相同字母间隔至少k个单位。本文通过举例说明问题,并提供一种解题思路,包括字符统计、优先队列和贪心算法的应用,阐述如何判断并实现满足条件的重排。
摘要由CSDN通过智能技术生成

题目描述:
给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少为 k。
所有输入的字符串都由小写字母组成,如果找不到距离至少为 k 的重排结果,请返回一个空字符串 “”。

示例 1:
输入: s = “aabbcc”, k = 3
输出: “abcabc”
解释: 相同的字母在新的字符串中间隔至少 3 个单位距离。

示例 2:
输入: s = “aaabc”, k = 3
输出: “”
解释: 没有办法找到可能的重排结果。

示例 3:
输入: s = “aaadbbcc”, k = 2
输出: “abacabcd”
解释: 相同的字母在新的字符串中间隔至少 2 个单位距离。

方法1:
主要思路:解题汇总
(1)先将原字符串的各个字符的数量进行统计;
(2)然后使用优先队列,将各个字符的数量和对应的字符压入到队列中,使用数量进行排序;
(3)使用贪心的思想,尽量先拍数量多的字符,每次从队列中取出 k 个元素,将其对应的字符放入到结果字符串中;
(4)这个过程中,需要判断当前要放入结果字符串的字符是否在当前位置之前的k个位置内出现过,若出现过,则直接返回空字符;
(5)若没有出现过,则将当前字符对应的数量减一,若此时数量仍不为0,则重新压入队列中;
(6)直到队列为空;

class Solution {
   
public:
    string rearrangeString(string s, int k) {
   
        if(k==0){
   //处理特殊的情形
            return s;
        }
        vector<int> counts(26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值