第六次的算法笔记 | 豆包MarsCode AI刷题

70 阅读5分钟

一、题目分析

本题给定了一个只包含英文大小写字母的字符串 s,要求计算从该字符串中最多能组成多少个字符串 “ku”。需要注意的是,在选取字符组成 “ku” 时,每次选一个字符后就不能再使用该字符了,而且大小写字母视为相同,也就是要忽略字母的大小写差异来进行统计和组合判断。通过给定的几个测试样例,像输入 “AUBTMKAxfuu” 能组成 1 个 “ku”,输入 “KKuuUuUuKKKKkkkkKK” 能组成 6 个 “ku” 等,可以更直观地理解题目的具体要求和预期的输出情况。

二、代码实现思路讲解

(一)统一处理大小写

代码首先执行了 s = s.lower() 这一步操作,目的是将输入的字符串 s 全部转换为小写形式。这样做的好处是后续在统计字符出现次数以及判断组成 “ku” 的情况时,可以统一标准,不用再去分别考虑大写和小写字母的不同情况,简化了处理逻辑。例如,对于输入字符串 “AUBTMKAxfuu”,经过这一步就变成了 “aubtmkaxfuu”。

(二)统计字符出现次数

  1. 初始化字典
    定义了一个空字典 char_countchar_count = {}),这个字典将用来存储字符串中每个字符以及它们各自出现的次数。例如,对于字符 a,字典中可能会记录为 {"a": 3}(如果 a 在字符串中出现了 3 次的话),以此类推记录下每个字符的出现频次。

  2. 遍历字符串更新字典
    接着通过一个 for 循环(for char in s:)来遍历转换为小写后的字符串 s 中的每一个字符。在循环内部,使用了条件判断语句来处理字典中字符计数的更新:

    • 如果当前字符 char 已经在字典 char_count 中了(通过 if char in char_count: 判断),那就说明这个字符之前已经出现过了,此时将它在字典中对应的出现次数加 1char_count[char] += 1)。
    • 如果当前字符 char 不在字典中,那就把这个字符添加到字典里,并且将它的出现次数初始化为 1char_count[char] = 1)。经过整个字符串的遍历后,字典 char_count 就完整地记录好了每个字符在字符串中的出现次数情况。

(三)计算 “k” 和 “u” 的出现次数并取最小值

  1. 获取 “k” 和 “u” 的出现次数
    使用 char_count.get('k', 0) 和 char_count.get('u', 0) 分别从字典 char_count 中获取字符 “k” 和 “u” 的出现次数。这里 get 方法的作用是尝试从字典中获取对应键的值,如果键不存在(也就是字符串中可能没有出现该字符),则返回默认值 0。例如,对于字符串 “abcdefgh”,由于里面没有 “k” 和 “u”,所以获取到的次数都是 0
  2. 取两者最小值确定能组成 “ku” 的数量
    因为要组成 “ku”,其数量取决于 “k” 和 “u” 中数量较少的那个字符的个数,所以通过 min(count_k, count_u) 来取 “k” 和 “u” 出现次数的最小值,这个最小值就是从给定字符串中最多能组成 “ku” 的数量。比如,如果 count_k = 3count_u = 5,那么最多只能组成 3 个 “ku”,因为 “k” 的数量限制了整体组合的数量。

(四)返回结果

最后,通过 return min(count_k, count_u) 将计算得出的最多能组成 “ku” 的数量返回,这个返回值就是符合题目要求的最终答案。

三、测试样例分析

  • 样例 1
    输入 s = "AUBTMKAxfuu"

    • 首先将其转换为小写 “aubtmkaxfuu”。
    • 然后统计字符出现次数,字典 char_count 大致会记录成 {"a": 1, "b": 1, "t": 1, "m": 1, "k": 1, "x": 1, "f": 1, "u": 2}(顺序可能不同)。
    • 获取 “k” 的出现次数 count_k = 1,“u” 的出现次数 count_u = 2,取最小值 min(1, 2) = 1,所以最多能组成 1 个 “ku”,与样例输出一致,符合题目要求。
  • 样例 2
    输入 s = "KKuuUuUuKKKKkkkkKK"

    • 转换为小写后还是本身。
    • 统计字符出现次数后字典 char_count 类似 {"k": 10, "u": 6}(仅示意主要相关字符)。
    • 获取 count_k = 10count_u = 6,取最小值 min(10, 6) = 6,即最多能组成 6 个 “ku”,和样例输出相符。
  • 样例 3
    输入 s = "abcdefgh"

    • 转换小写后不变。

    • 统计字符出现次数时,字典中 “k” 和 “u” 的出现次数都是 0(因为字符串里没有这两个字符),取最小值 min(0, 0) = 0,所以最多能组成 0 个 “ku”,也与样例输出一致。

def solution(s: str) -> int:
    # 将字符串转换为小写,以便统一处理大小写
    s = s.lower()
    
    # 统计每个字符的出现次数
    char_count = {}
    for char in s:
        if char in char_count:
            char_count[char] += 1
        else:
            char_count[char] = 1
    
    # 计算 'k' 和 'u' 的出现次数,取两者的最小值
    count_k = char_count.get('k', 0)
    count_u = char_count.get('u', 0)
    
    # 返回最多能组成的 "ku" 的数量
    return min(count_k, count_u)

if __name__ == '__main__':
    print(solution("AUBTMKAxfuu") == 1)
    print(solution("KKuuUuUuKKKKkkkkKK") == 6)
    print(solution("abcdefgh") == 0)

通过以上对代码实现思路的详细阐述以及针对各个测试样例的分析,可以清晰地看到这段代码是如何依据题目规则准确地计算出从给定字符串中最多能组成 “ku” 的数量的,很好地解决了这道算法题。