要件:文字列内で最長の連続した数値文字列を検索し、最長の数値文字列を返します。
入力:文字列
出力:数値の最長の文字列
アイデア:1。最初に入力文字列を文字ごとにトラバースし、数字以外の文字に0を設定し、各連続番号を1〜999999の数字に設定し、取得した文字をベクトルコンテナに入れます
。2。で最大要素値を見つけます。ベクトルコンテナとそれに対応するインデックス; 3。STLの
文字列の関数substr(インデックス値+ 1-最大、最大)を
使用して目的の文字列を検索します; 4.再帰関数findIntegerStrを使用して、最長の連続数値文字列が複数あるかどうかを検索します。
テスト方法:1。入力:数字のない文字列。戻り値:必要な文字列が見つかりませんでした
。2。入力:数字を含む文字列(数字の最長の文字列には1つしかありません)。戻り値:連続する数字の最長の文字列;
3.入力:数字を含む文字列(最長の数字を持つ連続する文字列が複数あります)。戻り値:同じ長さと最長の長さを持つすべての連続する数値文字列を返します。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
string str; //待输入的字符串
string subStr; //想要输出的子串
int max_val; //最大数字子串长度
int max_val_distance; //最大数字子串最后一位对应的索引
template<class T>
void myPrint(T val) //用于编写遍历vector的函数,可同下面的函数一起删除
{
cout << val << " ";
}
template<class T>
void printVector(vector<T> v) //遍历vector中的元素
{
for_each(v.begin(), v.end(), myPrint<T>);
}
void findIntegerStr(string str, vector<int> vec, int max_val, int max_val_distance)
{
if (max_val != 0)
{
cout << "您想要输出的最长连续数字字符串为:" << str.substr(max_val_distance + 1 - max_val, max_val) << "; " << endl;
vec[max_val_distance] = 0;
vector<int>vec1 = vec;
int max_val1 = 0, max_val_distance1 = 0;
vector<int>::iterator max1 = max_element(vec1.begin(), vec1.end());
max_val1 = *max1;
max_val_distance1 = distance(vec1.begin(), max1);
if (max_val_distance1 > max_val_distance)
{
return findIntegerStr(str, vec1, max_val1, max_val_distance1);
}
else
{
cout << "上面就是您想要输出的所有字符串!!!" << endl;
}
}
else
{
cout << "未找到您要的连续数字字符串!" << endl;
return;
}
}
int main()
{
cout << "请手动输入字符串:";
cin >> str;
int len = str.size(); //字符串长度
string str2 = str;
vector<int> vec;
int j = 0;
for (auto i = 0; i < len; i++)
{
if (str[i] >= '0' && str[i] <= '9')
{
j++;
str[i] = j;
vec.push_back(str[i]);
}
else
{
j = 0;
str[i] = 0;
vec.push_back(str[i]);
}
}
vector<int>::iterator max = max_element(vec.begin(), vec.end());
max_val = *max;
int max_val_distance = distance(vec.begin(), max);
findIntegerStr(str2, vec, max_val, max_val_distance);
system("pause");
return 0;
}