组成字符串ku的最大次数 | 豆包MarsCode AI刷题

94 阅读2分钟

组成字符串ku的最大次数 | 豆包MarsCode AI刷题

组成字符串ku的最大次数 - MarsCode

很简单,简单计数就好了没什么难度

摘要

本文介绍了如何从一个字符串中统计字母 "K/k" 和 "U/u" 的出现次数,以便计算能够组成字符串 "ku" 的最大数量。通过简单的遍历和计数操作,计算字母对的数量。本文提供了Python和Go的代码实现,时间复杂度为 O(n)O(n)

问题描述

给定一个包含英文大小写字母的字符串 ss,目标是计算字符串中最多能组成多少个字符串 "ku"。每次可以随机选择字母 "k" 和 "u"(不区分大小写),但每个字母只能使用一次。

示例

  • 输入:s = "AUBTMKAxfuu"
    输出:1

  • 输入:s = "KKuuUuUuKKKKkkkkKK"
    输出:6

  • 输入:s = "abcdefgh"
    输出:0

原理分析

1. 字母计数

为了确定能组成多少个 "ku",我们需要统计字符串中 "k" 和 "u" 的数量。由于字母大小写不敏感,可以将 "K" 和 "k" 视为相同字符,同理 "U" 和 "u" 也视为相同字符。

2. 取最小值

组成一个 "ku" 字符串需要一个 "k" 和一个 "u",因此可以组成的 "ku" 数量取决于 "k" 和 "u" 中较小的计数。

代码实现

Python代码

def solution(s: str) -> int:
    """
    该函数接收一个字符串 s,统计其中字符 'K'/'k' 和 'U'/'u' 的数量。
    返回 'K'/'k' 和 'U'/'u' 中较小的那个数量,以便能组成相同数量的配对。
    """
    cnt_map = {'k': 0, 'u': 0}  # 初始化计数字典

    # 遍历字符串统计 'K'/'k' 和 'U'/'u' 的数量
    for char in s:
        if char in ('K', 'k'):
            cnt_map['k'] += 1
        elif char in ('U', 'u'):
            cnt_map['u'] += 1

    # 返回 'k' 和 'u' 的最小计数
    return min(cnt_map['k'], cnt_map['u'])


if __name__ == "__main__":
    # 测试用例
    print(solution("AUBTMKAxfuu") == 1)           # 应输出 True
    print(solution("KKuuUuUuKKKKkkkkKK") == 6)    # 应输出 True
    print(solution("abcdefgh") == 0)              # 应输出 True

Go语言代码

package main

import (
	"fmt"
)

func solution(s string) int {
    cntMap := map[byte]int{}
    for i := 0; i < len(s); i++ {
        if s[i] == 'K' || s[i] == 'k' {
            cntMap['k']++
        } else if s[i] == 'U' || s[i] == 'u' {
            cntMap['u']++
        }
    }
    if cntMap['u'] > cntMap['k'] {
        return cntMap['k']
    } else {
        return cntMap['u']
    }
}

func main() {
    fmt.Println(solution("AUBTMKAxfuu") == 1)          // 应输出 true
    fmt.Println(solution("KKuuUuUuKKKKkkkkKK") == 6)   // 应输出 true
    fmt.Println(solution("abcdefgh") == 0)             // 应输出 true
}