字符串中找出连续最长的数字串

#include <iostream>
#include <string>
using namespace std;

bool IsContinuousDigit(string& str, int begin, int end){
    for(begin; begin < end; ++begin){
        if(!isdigit(str[begin]))
            return false;
    }
    return true;
}
bool IsContinuousAlpha(string& str, int begin, int end){
    for(begin; begin < end; ++begin){
        if(!isalpha(str[begin]))
            return false;
    }
    return true;
}

int main()
{
    string str;
    cin >> str;
    auto it = str.begin();
    int maxCount = 0, count = 0;
    while(it != str.end()){
        count = 0; // 重置count
        if(isalpha(*it)){ // 字母
            while(it != str.end() && isalpha(*it)){ // 一直是字母
                ++it;
                ++count;
            }
            maxCount = max(maxCount, count);
        }
        else{
            while(it != str.end() && isdigit(*it)){ // 一直是数字
                ++it;
                ++count;
            }
            maxCount = max(maxCount, count);
        }
    }
    string ret;
    // 寻找maxCount个数据的子串
    for(size_t i = 0; i < str.size(); i++){
        if(IsContinuousDigit(str, i, i+maxCount) || IsContinuousDigit(str, i, i+maxCount))
            ret += str.substr(i, maxCount);
    }
    cout << ret << endl;
}

由于我一开始看错题目了,把字符串看成数字串。因此多了很多多余操作。

如果只是数字串的话。可以考虑用一个额外的空间tmp来存储全是数字的串,然后当走到不是数字时,与ret比较哪个大,tmp大就把tmp的内容赋值给ret,如果ret大,就清空tmp
继续遍历。

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string str, tmp, ret;
    cin >> str;
    for(size_t i = 0; i < str.size(); ++i)
    {
        if(str[i] >= '0' && str[i] <= '9'){
            tmp += str[i];
        }
        else{ // 非数字时比较size大小
            if(tmp.size() > ret.size())
                ret = tmp;
            else
                tmp.clear();
        }
    }
    // i走到\0的时候,也有可能最后的数字串是最大的,
    // 但此时因为已经跳出for循环了,因此需要再比较一次
    if(tmp.size() > ret.size())
        ret = tmp;
    else
        tmp.clear();
    cout << ret << endl;
    return 0;
}