跳到主要内容

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}。
  • 类似思路可用于提取邮箱、手机号等有规律子串。

相关题目​

自测​

加载评论中...