问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。 当然,以下是解决这个问题的详细解答:
思路
- 提取数字:首先,我们需要从字符串中提取出所有的数字。这可以通过正则表达式实现,正则表达式能够匹配所有非数字字符,并将它们替换为空格。
- 分割字符串:将处理过的字符串按空格分割,得到一系列由数字组成的字符串。
- 去除前导零并转换为整数:由于字符串中的数字可能包含前导零,我们需要在转换为整数之前去除它们。整数转换会自动处理前导零。
- 去重并计数:使用集合来存储不同的整数,因为集合会自动去除重复的元素。最后,集合的大小就是不同整数的数量。
具体步骤
- 使用正则表达式
re.sub(r'[^\d]', ' ', word)将字符串中的所有非数字字符替换为空格。 - 使用
split()方法将处理过的字符串按空格分割成多个部分。 - 遍历分割后的字符串列表,对每个部分使用
int()函数转换为整数,并添加到集合中。 - 返回集合的大小。
代码
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)
知识点
- 正则表达式:用于匹配字符串中的特定模式。
- 字符串处理:使用
split()和int()方法处理和转换字符串。 - 集合:用于存储唯一元素,自动去除重复项。
时间复杂度
- 正则表达式替换:假设字符串长度为 ,则正则表达式替换的时间复杂度为 。
- 分割字符串:分割操作的时间复杂度也是 。
- 转换和去重:假设有 个数字字符串,则转换和去重的时间复杂度为 。 总的时间复杂度为 ,其中 。
空间复杂度
- 分割后的字符串列表:空间复杂度为 。
- 集合:空间复杂度为 。 总的空间复杂度为 。 在实际情况中, 通常远小于 ,因此我们可以认为这个算法在时间和空间上都是高效的。