问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
测试样例
样例1:
输入:
word = "a123bc34d8ef34"
输出:3
样例2:
输入:
word = "t1234c23456"
输出:2
样例3:
输入:
word = "a1b01c001d4"
输出:2
问题分析
小R需要通过字符串处理,找出其中以非数字字符分隔的不同整数。需要注意以下几点:
- 非数字字符需要被替换为空格;
- 数字前的前导零需要被忽略;
- 返回的结果是所有不同整数的数目。
解题思路
- 字符串替换:将字符串中非数字字符替换为空格。
- 分割与提取整数:使用空格分割字符串提取可能的数字部分。
- 去除前导零并去重:将所有数字部分转为整数(去除前导零后自动去重)。
- 统计不同整数:统计集合中不同整数的个数。
算法步骤
- 遍历字符串,将非数字字符替换为空格。
- 使用字符串分割方法,提取所有数字子串。
- 将数字子串转换为整数,并存入集合以去重。
- 返回集合的大小。
代码实现
以下是Python的代码实现:
def solution(word: str) -> int:
# Step 1: 替换非数字字符为空格
for char in word:
if not char.isdigit():
word = word.replace(char, ' ')
# Step 2: 分割字符串并提取整数子串
numbers = word.split()
# Step 3: 去除前导零并使用集合去重
unique_integers = {int(num) for num in numbers}
# Step 4: 返回集合的大小
return len(unique_integers)
# 测试样例
print(solution("a123bc34d8ef34")) # 输出: 3
print(solution("t1234c23456")) # 输出: 2
print(solution("a1b01c001d4")) # 输出: 2
优化分析
- 字符串替换优化:
- 替换使用
str.translate()和str.maketrans()可提高性能。
- 替换使用
- 集合操作:
- 使用集合直接初始化数字列表,避免额外存储。
优化代码如下:
def solution(word: str) -> int:
# 使用 translate 和 maketrans 提高效率
table = str.maketrans({chr(i): ' ' for i in range(256) if not chr(i).isdigit()})
word = word.translate(table)
# 提取整数并去重
unique_integers = {int(num) for num in word.split()}
# 返回不同整数的个数
return len(unique_integers)
# 测试样例
print(solution("a123bc34d8ef34")) # 输出: 3
print(solution("t1234c23456")) # 输出: 2
print(solution("a1b01c001d4")) # 输出: 2
时间与空间复杂度分析
- 时间复杂度:
- 替换字符:O(n)O(n),其中 nn 是字符串的长度。
- 分割字符串:O(m)O(m),mm 为分割后子串的总长度。
- 转换为整数:O(k)O(k),kk 为数字子串的数量。
- 综合复杂度为 O(n+m+k)O(n + m + k),实际接近于 O(n)O(n)。
- 空间复杂度:
- 使用集合存储不同整数,最坏情况下空间复杂度为 O(k)O(k),kk 为整数数量。