题目描述:
输入一个字符串,返回其最长的数字子串,以及其长度。若有多个最长的数字子串,则将它们全部输出(按原字符串的相对位置)
本题含有多组样例输入。
输入描述:
输入一个字符串。1<=len(字符串)<=200
输出描述:
输出字符串中最长的数字字符串和它的长度,中间用逗号间隔。如果有相同长度的串,则要一块儿输出(中间不要输出空格)。
示例:
输入:
abcd12345ed125ss123058789
a8a72a6a5yy98y65ee1r2
输出:
123058789,9
729865,2
说明:
样例一最长的数字子串为123058789,长度为9
样例二最长的数字子串有72,98,65,长度都为2
解题思路:
这题是字符串分析题。首先,遍历寻找连续数字的子串,若出现非数字,则分析前方的数字子串是否更长,若更长,则清除当前result容器内容,并放入该子串;若数字子串同最长的一样长,则往容器中继续放入,这样就可以存放同样最长的多个子串;遍历完成后考虑到字符串结尾可能有一个数字子串,所以也进行一次判断;最后,将容器的string连接起来,并返回最大长度即可。
测试代码:
#include <iostream> #include <string> #include <vector> using namespace std; string find(string str,int &maxnum) { vector<string> result; string maxstr,temp; int num=0; int size=str.size(); // 遍历寻找子串 for(int i=0;i<size;++i) { if(str[i]>='0'&&str[i]<='9') { temp+=str[i]; num++; } else{ // 若出现更长的子串,则清空容器 if(num>maxnum) { maxnum=num; result.clear(); result.push_back(temp); } // 若出现同最大长度一致的子串,放入容器 else if(num==maxnum) { result.push_back(temp); } temp.clear(); num=0; } } // 针对末尾数字子串的情况,进行补充 if(num>maxnum) { maxnum=num; result.clear(); result.push_back(temp); } else if(num==maxnum) { result.push_back(temp); } // 遍历容器生成最终数字子串 for(auto s:result) { maxstr+=s; } return maxstr; } int main() { string str; while(getline(cin,str)) { int maxnum=0; cout<<find(str,maxnum)<<","<<maxnum<<endl; } return 0; }