最少字符串操作次数 | 豆包MarsCode AI 刷题

70 阅读3分钟

最少字符串操作次数 | 豆包MarsCode AI 刷题

在字符串处理中,删除重复字符并添加新字符是一个常见的问题。小U得到了一个只包含小写字母的字符串 ( S )。她可以执行如下操作:每次选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。小U想知道,最少需要多少次操作才能使得字符串中的所有字母都不相同?本文将探讨如何帮助小U计算最少的操作次数。

问题描述

小U有一个只包含小写字母的字符串 ( S )。她可以执行以下操作:每次选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。目标是计算最少需要多少次操作才能使得字符串中的所有字母都不相同。

解决方案

为了帮助小U计算最少的操作次数,我们可以使用一个哈希表来记录每个字符的出现次数。具体步骤如下:

  1. 初始化变量
    • a:一个数组,用于记录每个字符的出现次数,大小为26(对应26个小写字母)。
    • res:记录操作次数,初始值为0。
  2. 遍历字符串
    • 遍历字符串 ( S ),对于每个字符,将其在数组 a 中对应的计数加1。
  3. 计算操作次数
    • 遍历数组 a,对于每个字符的出现次数,计算其可以删除的对数(即 a[i] / 2),并将结果加到 res 中。
  4. 返回结果
    • 返回 res,即最少的操作次数。

代码实现

#include <iostream>
#include <string>
int solution(const std::string& S) {
    int a[26] = {0};  // 用于记录每个字符的出现次数
    int res = 0;  // 记录操作次数
    // 遍历字符串,记录每个字符的出现次数
    for (int i = 0; i < S.size(); i++) {
        a[S[i] - 'a']++;
    }
    // 计算操作次数
    for (int i = 0; i < 26; i++) {
        res += a[i] / 2;
    }
    return res;
}
int main() {
    // 测试样例
    std::cout << (solution("abab") == 2) << std::endl;  // 输出:1
    std::cout << (solution("aaaa") == 2) << std::endl;  // 输出:1
    std::cout << (solution("abcabc") == 3) << std::endl;  // 输出:1
    return 0;
}

代码解释

  • 初始化a 是一个大小为26的数组,用于记录每个字符的出现次数。res 用于记录操作次数,初始值为0。
  • 遍历字符串:遍历字符串 ( S ),对于每个字符,将其在数组 a 中对应的计数加1。这里使用 S[i] - 'a' 将字符映射到数组的索引。
  • 计算操作次数:遍历数组 a,对于每个字符的出现次数,计算其可以删除的对数(即 a[i] / 2),并将结果加到 res 中。
  • 返回结果:返回 res,即最少的操作次数。

测试样例

  • 样例1S = "abab",输出:2
  • 样例2S = "aaaa",输出:2
  • 样例3S = "abcabc",输出:3 通过上述方法,我们可以有效地帮助小U计算出最少的操作次数,确保字符串中的所有字母都不相同。