HJ92. 在字符串中找出连续最长的数字串
题目描述
在字符串中找出连续最长的数字串,并按格式输出:
- 若有多个最长数字串,则全部输出(按出现顺序拼接)。
- 输出格式:所有最长数字串拼接 +
,+ 最长长度。
输入格式
一行字符串。
输出格式
拼接后的最长数字串 + , + 最长长度。
示例
示例 1
输入:
abcd12345ed125ss123456789
输出:
123456789,9
示例 2
输入:
abcd12345ed125ss123058789
输出:
123058789,9
解题思路
第一步:理解问题本质
把字符串中的连续数字段全部提取出来,找出最长的一段(可能多段并列),把最长的几段拼接后输出,再接 , 和长度。
第二步:暴力解法
逐个字符遍历,记录每个连续数字段的起止位置,再比较长度。代码较长、易错(边界处理多)。
第三步:最优解法(正则)
用 \d+ 一次性提取所有连续数字串,再统计最大长度并拼接:
nums = re.findall(r'\d+', s)
maxlen = max(len(x) for x in nums)
res = ''.join(x for x in nums if len(x) == maxlen)
print(f"{res},{maxlen}")
findall 自动按出现顺序返回,保证多段拼接顺序正确。
完整代码实现
算法可视化 · 逐帧回放这道题的代码10 帧 · 录制输入
import sys
import re
def solve():
s = sys.stdin.readline().strip()
nums = re.findall(r'\d+', s)
if not nums:
return
maxlen = max(len(x) for x in nums)
res = ''.join(x for x in nums if len(x) == maxlen)
print(f"{res},{maxlen}")
if __name__ == "__main__":
solve()
示例推演
以 abc123def456 为例:
步骤 1:findall(r'\d+', ...) → ['123','456']
步骤 2:最大长度 maxlen = 3
步骤 3:长度等于 3 的段:'123'、'456',拼接 '123456'
步骤 4:输出 123456,3
复杂度分析
| 解法 | 时间复杂度 | 空间复杂度 | 说明 |
|---|---|---|---|
| 手动遍历 | O(n) | O(n) | 边界处理繁琐 |
| 正则提取 | O(n) | O(n) | 简洁清晰 |
n 为字符串长度
易错点总结
1. 多个等长段要全部输出
只输出第一个最长段会错。要用 maxlen 过滤出所有等长段再拼接。
2. 拼接顺序
findall 保持出现顺序,直接用即可;不要排序打乱顺序。
3. 无数字串的边界
若字符串无数字,nums 为空,max() 会报错,需先判断。
扩展思考
- 正则
\d+匹配连续数字;若需匹配特定长度可用\d{3}。 - 类似思路可用于提取邮箱、手机号等有规律子串。