相邻字母匹配计数问题
问题描述
小F有一个由大写字母和小写字母组成的字符串。她想知道,在忽略字母大小写的情况下,有多少对相邻的字母是相等的。
例如,对于字符串 "aABbbC",在忽略大小写的情况下,有 3 对相邻字母是相等的,分别是 "aA","AB" 和 "bb"。
测试样例
样例1:
输入:
s = "aABbbC"
输出:3
样例2:
输入:
s = "XYZxyZ"
输出:0
样例3:
输入:
s = "AaBbCc"
输出: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
复杂度分析
时间复杂度分析
-
转换为小写:
s = s.lower()- 这一步的时间复杂度是 O(n),其中 n 是字符串的长度。因为
lower()方法需要遍历整个字符串来转换每个字符的大小写。
- 这一步的时间复杂度是 O(n),其中 n 是字符串的长度。因为
-
遍历字符串:
for i in range(len(s) - 1)- 这一步的时间复杂度是 O(n),其中 n 是字符串的长度。因为我们需要遍历字符串中的每一个字符(除了最后一个字符)。
-
比较相邻字母:
if s[i] == s[i + 1]- 这一步的时间复杂度是 O(1),因为每次比较只需要常数时间。
综合以上步骤,整个算法的时间复杂度是 O(n),其中 n 是字符串的长度。
空间复杂度分析
-
转换为小写:
s = s.lower()- 这一步的空间复杂度是 O(n),因为
lower()方法会创建一个新的字符串,其长度与原字符串相同。
- 这一步的空间复杂度是 O(n),因为
-
计数器:
count = 0- 这一步的空间复杂度是 O(1),因为计数器只是一个整数变量,占用常数空间。
综合以上步骤,整个算法的空间复杂度是 O(n),其中 n 是字符串的长度。
总结
- 时间复杂度:O(n)
- 空间复杂度:O(n)
总结与思考
- 数据预处理:忽略大小写,先将字符串转换为统一的大小写(例如全部转换为小写)。
- 遍历字符串:遍历字符串中的每一个字符(除了最后一个字符),检查相邻的字母是否相等。
- 计数:如果相邻的字母相等,则计数器加一。