题解 | #在字符串中找出连续最长的数字串#
在字符串中找出连续最长的数字串
http://www.nowcoder.com/practice/2c81f88ecd5a4cc395b5308a99afbbec
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){
string s;
while(cin>>s){
int i=0;
int maxn=0;
vector<int> left;
left.clear();
while(i<s.size()){
if(isdigit(s[i])==true){
int j=i+1;
while(isdigit(s[j])==true){
j++;
}
if((j-i)==maxn){
left.push_back(i);
}
if((j-i)>maxn){
maxn=j-i;
left.clear();
left.push_back(i);
}
i=j+1;
}
else{
i++;
}
}
for(int k=0;k<left.size();k++){
for(int p=0;p<maxn;p++){
cout<<s[left[k]+p];
}
}
cout<<','<<maxn<<endl;
}
return 0;
}
参考前排大佬的解答完成了代码,思路是: 1.定义一个容器left来保存每个最长数字串的左端数字的下标; 2.定义一个指针i从字符串左端开始移动,再定义最长数字串长度初始化为maxn=0; 3.判断当前字符是否数字,是的话执行4操作,否的话继续右移动; 4.定义另一个指针j=i+1,如果j指向的字符还是数字的话,j继续移动,否则进入5; 5.当前j指向位置的字符是非数字,同时从指针i开始到j左侧都是数字,即为当前最长子串,对其长度j-i进行判断:(1)当长度等于maxn时将指针i的值加入容器left中;(2)当长度大于maxn时更新maxn,清空容器left,再将指针i的值存入容器,并进入6。 6.当前指针j左侧的最长数子串已经记录,并且当前字符为非数字字符,因此将指针i移动到i=j+1,若为超过右端,跳回3判断。 7.通过前六个步骤已经找到了最大数字串的长度和左端,然后遍历容器元素,依次输出从每个元素开始的maxn个元素,然后输出逗号和maxn。 8.由于题目说到可能输入多组数据,因此要用while(cin>>s)来判断输入,并在每个字符串的所有输出完成后输出换行符。