最少字符串操作次数 MarsCode刷题

问题描述
小U得到一个只包含小写字母的字符串 S。她可以执行如下操作:每次选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。小U想知道,最少需要多少次操作才能使得字符串中的所有字母都不相同?
解题思路

统计字母出现次数:

首先,我们需要统计字符串中每个字母的出现次数。可以使用一个大小为26的数组(因为小写字母只有26个)来存储每个字母的出现次数。

计算最少操作次数:

对于每个字母,如果它的出现次数大于1,那么我们需要进行操作来减少重复字母的数量。
每次操作可以将两个相同的字母删除,并在字符串末尾添加一个任意的小写字母。
因此,对于每个字母,如果它的出现次数为 n,那么需要进行的操作次数为 n/2。

累加操作次数:

将所有字母的操作次数累加起来,得到最终的最少操作次数。

数据结构选择

数组:使用一个大小为26的数组来存储每个字母的出现次数。

算法步骤

初始化数组:创建一个大小为26的数组 count,用于存储每个字母的出现次数。
统计字母出现次数:遍历字符串 S,对于每个字符,将其对应的 count 数组中的值加1。
计算最少操作次数:遍历 count 数组,对于每个字母的出现次数 n,如果 n > 1,则累加 (n - 1) 到操作次数中。
返回结果:返回累加的操作次数。

让我们详细讨论一下如何计算最少操作次数的逻辑。
问题理解
我们需要计算最少需要多少次操作才能使得字符串中的所有字母都不相同。每次操作可以选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。

#include <iostream>
#include <string>

int solution(const std::string& S) {
    // write code here
    int a[400] = {0};
    int res = 0;
    for(int i = 0 ; i < S.size();i++){
        a[S[i]]++;
    }
    for(int i = 0 ; i < 400; i++){
       res+=a[i]/2;
    }
    return res;
}

int main() {
    std::cout << (solution("abab") == 2) << std::endl;
    std::cout << (solution("aaaa") == 2) << std::endl;
    std::cout << (solution("abcabc") == 3) << std::endl;
}


总结
通过统计每个字母的出现次数,并计算需要进行的操作次数,我们可以得到最少需要多少次操作才能使得字符串中的所有字母都不相同。
感觉这种题挺简单的,就是统计每个字母的出现次数,一次可以消除两个,那么答案就是 把所有字母数/2就行。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XXUZZWZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值