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

5 阅读4分钟
def solution(S: str) -> int:
    from collections import Counter
    import math

    # 计算每个字符的出现次数
    frequency = Counter(S)
    operations = 0

    # 遍历频率字典,计算需要的操作次数
    for count in frequency.values():
        if count > 1:
            # 计算需要的操作次数(向上取整)
            operations += math.ceil((count - 1) / 2)

    return operations

函数定义及模块导入部分

  • def solution(S: str) -> int:

    • 这行代码定义了一个名为 solution 的函数。函数的定义以 def 关键字开始,后面跟着函数名 solution
    • (S: str) 表示函数接受一个参数 S,并且通过类型标注指定 S 的类型为字符串(str)。这种类型标注在 Python 中是一种提示信息,帮助开发者和代码阅读者更清晰地了解函数参数的预期类型,但在实际运行时并不会严格强制类型检查(不过一些工具和编辑器可能会根据它给出相关提示)。
    • -> int 是函数的返回值类型标注,它表明这个函数执行完毕后应该返回一个整数类型的值。
  • from collections import Counter

    • 这里从 Python 的标准库 collections 模块中导入了 Counter 类。Counter 类是一个非常方便的工具,专门用于统计可迭代对象(如字符串、列表等)中每个元素出现的次数。它会返回一个类似于字典的对象,其中键是可迭代对象中的元素,值是该元素出现的次数。
  • import math

    • 导入了 Python 的标准库 math 模块。math 模块提供了许多数学相关的函数和常量,在后续的代码中,我们将使用其中的 ceil 函数来进行向上取整操作。

计算字符出现次数部分

  • frequency = Counter(S)

    • 这行代码调用了刚刚导入的 Counter 类的构造函数,并将输入字符串 S 作为参数传递给它。

    • Counter 类会遍历输入的字符串 S,并对其中每个字符出现的次数进行统计。例如,如果 S = "abab",那么 Counter(S) 会返回一个类似于 Counter({'a': 2, 'b': 2}) 的对象。这里的 Counter 对象就像是一个特殊的字典,键是字符串中的字符('a' 和 'b'),值是该字符在字符串中出现的次数(都是 2)。我们将这个 Counter 对象赋值给变量 frequency,以便后续对字符出现次数的进一步处理。

初始化操作次数变量部分

  • operations = 0

    • 这行代码创建了一个名为 operations 的变量,并将其初始值设置为 0。这个变量将用于累加在处理字符串过程中,为了使字符串中所有字母都不相同而需要进行的操作次数。

遍历频率字典并计算操作次数部分

  • for count in frequency.values():

    • 这行代码开始了一个 for 循环,循环的迭代对象是 frequency.values()。前面我们已经通过 Counter(S) 创建了 frequency 对象,它类似于一个字典,其中的值(values())就是每个字符在字符串中出现的次数。所以这个 for 循环会依次遍历字符串 S 中每个字符的出现次数。例如,如果 frequency = Counter({'a': 2, 'b': 2}),那么这个循环会依次迭代 2 和 2 这两个值(分别对应字符 'a' 和 'b' 的出现次数)。
  • if count > 1:

    • 在每次循环迭代中,都会对当前迭代到的字符出现次数 count 进行判断。如果 count 大于 1,这意味着该字符在字符串中有重复出现的情况,根据题目要求,我们需要对这些重复出现的字符进行操作来使字符串中所有字母都不相同。
  • operations += math.ceil((count - 1) / 2)

    • 当字符的出现次数 count 大于 1 时,我们需要计算消除这些重复字符所需的操作次数。

    • 每次操作可以删除两个相同的字符并添加一个任意小写字母。那么对于一个出现次数为 count 的字符,要消除所有重复,每次操作能减少 2 个重复字符,但最后可能剩下 1 个重复字符(例如,如果 count = 3,第一次操作后还剩下 1 个重复字符),所以需要向上取整来确保能完全消除重复。

    • 计算公式为 (count - 1) / 2,这是因为每次操作能处理掉 2 个重复字符,所以要先减去 1(留下最后可能剩下的那个重复字符),再除以 2 得到大致的操作次数。然后通过 math.ceil((count - 1) / 2) 使用 math 模块中的 ceil 函数对这个结果进行向上取整操作,得到准确的操作次数。最后将这个计算得到的操作次数累加到 operations 变量中,以便后续返回最终的总操作次数。

返回结果部分

  • return operations

    • 当完成对字符串 S 中所有字符出现次数的遍历和相应操作次数的计算后,这行代码会返回累加得到的 operations 值。这个值就是使输入字符串 S 中所有字母都不相同所需的最少操作次数。