派派的刷题之旅(四) | 豆包MarsCode AI 刷题

39 阅读2分钟

相邻字母匹配计数问题

问题描述

小F有一个由大写字母和小写字母组成的字符串。她想知道,在忽略字母大小写的情况下,有多少对相邻的字母是相等的。

例如,对于字符串 "aABbbC",在忽略大小写的情况下,有 3 对相邻字母是相等的,分别是 "aA""AB" 和 "bb"

测试样例

样例1:

输入:s = "aABbbC"
输出:3

样例2:

输入:s = "XYZxyZ"
输出:0

样例3:

输入:s = "AaBbCc"
输出:3

思路解析

  1. 忽略大小写:我们可以将字符串中的所有字母转换为统一的大小写(例如全部转换为小写)。
  2. 遍历字符串:遍历字符串,检查每一对相邻的字母是否相等。
  3. 计数:如果相邻的字母相等,则计数器加一。

解题代码

def solution(s: str) -> int:
    # 将字符串转换为小写,以便忽略大小写
    s = s.lower()
    
    # 初始化计数器
    count = 0
    
    # 遍历字符串,检查相邻字母是否相等
    for i in range(len(s) - 1):
        if s[i] == s[i + 1]:
            # 如果相等,计数器加一
            count += 1
    
    return count

复杂度分析

时间复杂度分析

  1. 转换为小写s = s.lower()

    • 这一步的时间复杂度是 O(n),其中 n 是字符串的长度。因为 lower() 方法需要遍历整个字符串来转换每个字符的大小写。
  2. 遍历字符串for i in range(len(s) - 1)

    • 这一步的时间复杂度是 O(n),其中 n 是字符串的长度。因为我们需要遍历字符串中的每一个字符(除了最后一个字符)。
  3. 比较相邻字母if s[i] == s[i + 1]

    • 这一步的时间复杂度是 O(1),因为每次比较只需要常数时间。

综合以上步骤,整个算法的时间复杂度是 O(n),其中 n 是字符串的长度。

空间复杂度分析

  1. 转换为小写s = s.lower()

    • 这一步的空间复杂度是 O(n),因为 lower() 方法会创建一个新的字符串,其长度与原字符串相同。
  2. 计数器count = 0

    • 这一步的空间复杂度是 O(1),因为计数器只是一个整数变量,占用常数空间。

综合以上步骤,整个算法的空间复杂度是 O(n),其中 n 是字符串的长度。

总结

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

总结与思考

  • 数据预处理:忽略大小写,先将字符串转换为统一的大小写(例如全部转换为小写)。
  • 遍历字符串:遍历字符串中的每一个字符(除了最后一个字符),检查相邻的字母是否相等。
  • 计数:如果相邻的字母相等,则计数器加一。