题目:
有一天,小明在游戏中获得了一串数字,直觉告诉他这不是一串普通的数字串,或许可以破解一些关于网易的秘密。破解的第一步,他很想知道,在这串数字中,最多可以挑出多少个‘9706’
串。挑选的规则为:
(1)挑出的数字’9’,’7’,’0’,’6’在原串中可以不连续,但是数字的先后顺序不能改变
(2)使用过的数字不能被再次使用
如’123901370997606’
可以最多挑出2个’9706’
,而’6079’
则无法挑出任何一个’9706’
。
输入
第一行是整数T(T <= 100),表示下面有T组数据。
之后T行,每行为一组数据,每组数据为一个字符串。每个字符串的长度L <= 50000。每个字符串只会包含数字[‘0’…’9’]。
输出
输出T行,每行对应一个数据的输出结果,表示字符串最多能挑出多少个’9706’。
样例输入4
6097
97069706
997776600069
123901370997606
样例输出
0
2
1
2
实现代码:
//在输入字符串中寻找与指定字符串含有相同字符和顺序的子串个数,子串中的字符不一定连续
void PrintCount(vector<string> vec, string str)
{
//记录每组字符串中出现的次数
int count;
vector<string>::iterator it = vec.begin();//指向第一组字符串
for (;it != vec.end();++it)
{
//初始化当前字符串中符合条件的数目
count = 0;
string::iterator it2 = (*it).begin();//指向当前字符串的头一个字符
string::iterator it3 = str.begin();//指向指定字符串的头一个字符
int i = 0;//标志当前相等的字符数
while((*it).size() >= 0)//每组字符串的剩余长度>=0
{
//如果满足条件,则将count+1,it2和it3分别从头开始比较
if (i == str.size())
{
i = 0;
++count;
it2 = (*it).begin();
it3 = str.begin();
}
//防止迭代致尾元素之后
if (it2 == (*it).end())
{
break;
}
//对应位置的字符相等,相等时删除本组中的当前字符
if (*it2 == *it3)
{
++i;
it2 = (*it).erase(it2);
++it3;
}
else//不相等时只需要指向下一个字符
{
++it2;
}
}
//打印每组字符串中符合条件的次数
cout << count << endl;
}
}
测试程序:
int main(int argc,char* argv[])
{
int T;
cin >> T;
if (T < 0 || T > 100)
{
cout << "输入组数越界,请重输!" << endl;
cin >> T;
}
string str;
vector<string> vec;
while (T > 0)
{
cin >> str;
vec.push_back(str);
--T;
}
PrintCount(vec,"9706");
return 0;
}