描述
对于给定的由数字和小写字母混合构成的字符串 s,找到其中最长的数字++子串++ 。如果由多个相同长度的数字子串,则需要全部输出,具体输出的格式请参考输出描述。
++子串++为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。
输入描述:
输入一个长度为 1≦len(s)≦200、由数字和小写字母混合构成的字符串 s。保证至少存在一个数字子串。
输出描述:
记最长的数字子串长度为 l,有 m 个长度为 l 的数字子串。在一行上先首尾相连的输出 m 个长度为 l 的数字子串(不使用空格分割),随后输出一个逗号,再输出 l。
示例1
输入:
abcd12345ed125ss123058789
输出:
123058789,9
示例2
输入:
11a22b33c
输出:
112233,2
说明:
在这个样例中,数字子串 "11","22","33" 长度均为 2,都是最长的数字子串。
备注:
本题数据已规范为单组询问(2025/01/15)。
cpp
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
string s;
while (cin>>s)
{
int i=0;
int maxm = 0;
//记录最长数字子串的起始位置
vector<int> index;
while (i<s.size())
{
if ('0'<=s[i] && s[i]<='9')
{
int j = i + 1;
//找到一个连续的数字子串
while ('0'<=s[j] && s[j]<='9') j++;
//如果和当前最大长度相等,则记录子串的第一个字符
if ((j-i)==maxm)
{
index.push_back(i);
}
//如果大于当前最大长度,则更新
if ((j-i)>maxm)
{
maxm = j - i;
index.clear();
index.push_back(i);
}
i = j + 1;
}
else i++;
}
for (int h=0;h<index.size();h++)
{
for (int k=0;k<maxm;k++) cout<<s[index[h]+k];
}
cout<<','<<maxm<<endl;
}
return 0;
}