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

51 阅读3分钟

问题描述

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

解题步骤:

  1. 统计字符出现次数:使用Counter类来统计字符串S中每个字符出现的次数。
  2. 初始化操作次数:创建一个变量operations,并将其初始化为0,用于记录执行操作的总次数。
  3. 计算删除操作次数:遍历统计得到的字符计数,对于每个字符,如果它的出现次数大于1,则需要删除多余的字符对。每次删除一对相同的字符,操作次数加1。具体来说,如果一个字符出现了count次,则需要删除count // 2对字符。
  4. 返回操作次数:函数最终返回执行删除操作的总次数。

时间复杂度:

  • 统计字符出现次数:O(n),其中n是字符串S的长度。
  • 遍历字符计数并计算操作次数:O(k),其中k是不同字符的数量。在字符串只包含小写字母的情况下,k的最大值为26。
  • 总体时间复杂度:O(n + k),由于k是常数,因此可以简化为O(n)。

空间复杂度:

  • 字符计数字典:O(k),其中k是不同字符的数量。由于字符串只包含小写字母,k的最大值为26,因此空间复杂度可以认为是O(1)。
if __name__ == '__main__':
    # 循环读取输入直到EOF
    while True:
        try:
            # 读取一行输入
            S = input()
            # 输出操作次数
            print(solution(S))
        except EOFError:
            # 当输入结束时退出循环
            break

    # 测试用例
    print(solution("abab") == 2)  # 应该输出True
    print(solution("aaaa") == 2)  # 应该输出True
    print(solution("abcabc") == 3)  # 应该输出True

 collections模块

  • Counter类Countercollections模块中的一个子类,用于计数可哈希对象。它是一个字典,其中元素作为键,计数作为值。

错误与异常处理

  • try-except块:用于处理可能引发的异常。在这个问题中,try-except用于处理当输入结束时引发的EOFError异常。

 体会:

  1. 细节的重要性:在编写代码时,细节决定成败。例如,在这个问题中,正确使用Counter类、初始化变量以及处理输入输出都是细节,忽视这些细节可能导致程序出错。
  2. 代码的可读性与维护性:清晰的代码结构和良好的命名习惯可以提高代码的可读性,便于他人理解和维护。在解答问题时,始终注意保持代码的整洁和清晰。
  3. 算法与数据结构的选择:合适的算法和数据结构可以显著提高程序的效率。在这个问题中,使用Counter类来统计字符出现次数是一个高效的选择。