问题分析
这道题的核心是字符串处理和基本的集合操作。问题的主要任务是从一个混合了字母和数字的字符串中,找到所有不同的整数个数。这些整数满足两个要求:
- 它们是从字符串中提取出来的数字子串。
- 如果两个数字的十进制表示相同(无论前导零的数量),它们被视为相同。
例如,对于字符串 "a123bc34d8ef34"
:
- 替换非数字字符后,我们会得到分隔的数字子串
["123", "34", "8", "34"]
。 - 数字
34
出现了两次,但十进制表示是相同的,所以它只算一次。
最终,我们得到三个不同的整数:123
、34
和 8
。
解题思路
为了解决这个问题,我的主要思路分为以下几步:
第一步:提取数字子串
我们需要从混合字符串中提取出所有连续的数字。这可以通过正则表达式轻松实现。
正则表达式是一种强大的字符串模式匹配工具。在 Python 中,可以使用 re
模块。对于这个问题,表达式 \d+
非常合适:
\d
匹配任何一个数字字符(0-9)。+
表示匹配一个或多个连续的数字。
因此,re.findall(r'\d+', word)
会找到所有数字子串,并返回一个字符串列表。例如:
- 输入字符串
"a123bc34d8ef34"
,结果是["123", "34", "8", "34"]
。
第二步:去除前导零
题目明确指出,只有当两个整数的十进制表示不同(即不考虑前导零),它们才被视为不同。因此,我们需要将提取到的数字子串转换为整数:
- 例如,
"001"
转换为整数1
。 - 在 Python 中,直接使用
int()
函数可以轻松完成这一任务。int("001")
返回1
,而不会保留前导零。
第三步:统计不同的整数个数
将这些整数存储在一个集合(set
)中:
- 集合是一种无序的数据结构,具有自动去重的功能。
- 当我们将所有整数放入集合中后,集合中元素的个数就是不同整数的数量。
第四步:返回结果
最后,我们只需要返回集合的大小,表示不同整数的个数。
实现代码
根据上述思路,代码如下:
python
Copy code
import re
def solution(word: str) -> int:
# 使用正则表达式提取所有的数字子串
numbers = re.findall(r'\d+', word)
# 转换为整数,消除前导零,并存储到集合中
unique_numbers = set(int(num) for num in numbers)
# 返回集合中不同整数的个数
return len(unique_numbers)
if __name__ == '__main__':
print(solution("a123bc34d8ef34") == 3)
print(solution("t1234c23456") == 2)
print(solution("a1b01c001d4") == 2)
知识点讲解
1. 正则表达式
正则表达式是处理字符串的重要工具。通过模式匹配,可以快速提取、替换或验证字符串中的特定内容。
\d
匹配数字。+
表示匹配一个或多个连续的前一个模式。re.findall(pattern, string)
返回字符串中所有匹配的内容,作为一个列表。
在这道题中,re.findall(r'\d+', word)
的作用是提取所有连续的数字子串。
2. 集合去重
集合(set
)是一种无序、不可重复的容器。在 Python 中,集合非常适合解决去重问题。
- 如果我们将一个列表中的元素逐一添加到集合中,集合会自动移除重复的元素。
- 在这道题中,所有数字转换为整数后存入集合,就完成了去重的操作。
3. 转换为整数去除前导零
在 Python 中,使用 int()
函数可以轻松将字符串转换为整数。转换时会自动去掉前导零。例如:
python
Copy code
int("001") # 返回 1
int("123") # 返回 123
这是解决前导零问题的核心技巧。
4. 复杂度分析
-
时间复杂度:
- 提取数字子串的复杂度是
O(n)
,其中n
是字符串的长度。 - 转换为整数并存入集合的复杂度是
O(k)
,其中k
是提取出的数字子串的数量。 - 总时间复杂度为
O(n + k)
。
- 提取数字子串的复杂度是
-
空间复杂度:
- 使用了一个列表存储数字子串,以及一个集合存储不同的整数。
- 空间复杂度为
O(k)
。
示例分析
示例1:"a123bc34d8ef34"
- 提取的数字子串:
["123", "34", "8", "34"]
- 转换为整数:
{123, 34, 8}
- 不同整数数量:
3
输出为3
。
示例2:"t1234c23456"
- 提取的数字子串:
["1234", "23456"]
- 转换为整数:
{1234, 23456}
- 不同整数数量:
2
输出为2
。
示例3:"a1b01c001d4"
- 提取的数字子串:
["1", "01", "001", "4"]
- 转换为整数:
{1, 4}
- 不同整数数量:
2
输出为2
。
总结
通过正则表达式提取数字子串,使用整数转换消除前导零,结合集合去重,我们高效地解决了这道问题。整个过程体现了字符串处理与数据结构结合的思想。