问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
步骤:
- 正则表达式替换:首先,使用正则表达式
re.sub(r'[^\d]', ' ', word)将输入字符串word中所有非数字字符替换为空格。这样做的目的是将字符串中的数字与其他字符隔离开。 - 分割字符串:接着,使用
split()方法将处理过的字符串按照空格分割成多个部分。每个部分都是一个由数字组成的字符串。 - 创建集合:创建一个空集合
unique_integers,用于存储分割后字符串中转换成的不同整数。 - 转换整数并去重:遍历分割后的字符串列表
parts,对每个部分调用int()函数将其转换为整数(int()会自动去除字符串前导的零),然后将这些整数添加到集合unique_integers中。由于集合不允许重复元素,所以相同的整数只会被存储一次。 - 返回结果:最后,返回集合
unique_integers的大小,即集合中不同整数的数量。
代码:
import re
def solution(word: str) -> int:
# 使用正则表达式将所有非数字字符替换为空格
word = re.sub(r'[^\d]', ' ', word)
# 使用空格将字符串分割成多个部分
parts = word.split()
# 创建一个集合来存储不同的整数
unique_integers = set()
# 清除每个部分的前导零,并转换为整数
for part in parts:
num = int(part) # int() 函数会自动清除前导零
unique_integers.add(num)
# 返回集合的大小,即为不同整数的数量
return len(unique_integers)
# 测试样例
print(solution("a123bc34d8ef34") == 3)
print(solution("t1234c23456") == 2)
print(solution("a1b01c001d4") == 2)
时间复杂度:
- 正则表达式替换操作的时间复杂度为 O(n),其中 n 是输入字符串的长度。
- 分割字符串操作的时间复杂度也为 O(n),因为需要遍历整个字符串。
- 遍历分割后的字符串列表并转换为整数的时间复杂度为 O(m),其中 m 是分割后字符串列表的长度。
- 总体时间复杂度为 O(n + m),在大多数情况下,m 不会大于 n,因此可以简化为 O(n)。
空间复杂度:
- 分割后的字符串列表
parts的大小取决于输入字符串中数字的数量,因此空间复杂度为 O(m)。 - 集合
unique_integers的大小取决于不同整数的数量,其空间复杂度最坏情况下为 O(m)。 - 总体空间复杂度为 O(m),即与输入字符串中数字的数量成线性关系。