最长数字子串(HJ12)

最长数字子串

题目描述

https://www.nowcoder.com/share/jump/5832603751775720143943

对于给定的由数字和小写字母混合构成的字符串 s,找到其中最长的数字子串。如果有多个相同长度的数字子串,则需要全部输出。

  • 子串为从原字符串中连续选择一段字符得到的新字符串
  • 输入保证至少存在一个数字子串

示例

输入:

abcd12345ed125ss123058789
输出:
123058789,9

输入:

11a22b33c
输出:
112233,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/
作者
Ming
发布于
2026年4月9日
更新于
2026年4月9日
许可协议