最长数字子串(HJ12)
最长数字子串
题目描述
https://www.nowcoder.com/share/jump/5832603751775720143943
对于给定的由数字和小写字母混合构成的字符串 s,找到其中最长的数字子串。如果有多个相同长度的数字子串,则需要全部输出。
- 子串为从原字符串中连续选择一段字符得到的新字符串
- 输入保证至少存在一个数字子串
示例
输入:
abcd12345ed125ss123058789123058789,9输入:
11a22b33c112233,2方法一:正则表达式
解题思路
使用 re.findall(r'\d+', s) 直接提取所有连续数字串。
代码实现
import re
s = input().strip()
# 提取所有连续数字串
arr = re.findall(r'\d+', s)
# 找最长长度
max_len = max(len(x) for x in arr)
# 收集所有最长子串并拼接
res = ''.join(x for x in arr if len(x) == max_len)
print(f"{res},{max_len}")代码解析
re.findall(r'\d+', s)-\d+匹配一个或多个连续数字- 列表推导式筛选最长子串
''.join()拼接所有最长子串
时间复杂度:O(n) - 正则表达式线性扫描
方法二:列表替换
解题思路
将非数字字符替换为空格,利用 split()
自动处理连续空格。
代码实现
s = list(input().strip())
# 非数字字符替换为空格
for i in range(len(s)):
if not s[i].isdigit():
s[i] = ' '
arr = ''.join(s).split()
ans = max(len(d) for d in arr)
res = ''.join(x for x in arr if len(x) == ans)
print(str(res) + ',' + str(ans))代码解析
list(input())将字符串转为可变列表- 遍历替换非数字为空格,避免重复空格问题
''.join(s).split()自动处理连续空格- 两个生成器表达式分别求最长长度和收集结果
时间复杂度:O(n) - 单次遍历替换
总结
| 方法 | 时间复杂度 | 空间复杂度 | 特点 |
|---|---|---|---|
| 正则表达式 | O(n) | O(n) | 代码简洁,依赖 re 模块 |
| 列表替换 | O(n) | O(n) | 纯 Python 实现,易于理解 |
注:本题 n ≤ 200,两种方法都能通过
最长数字子串(HJ12)
https://mingsm17518.github.io/2026/04/09/algorithm/华为机考/nowcoder/String/12_longest_digit_substring/