字符串笔试题1:找出子串在字符串中出现的次数,子串中的字符可以不连续,但顺序固定

题目:
有一天,小明在游戏中获得了一串数字,直觉告诉他这不是一串普通的数字串,或许可以破解一些关于网易的秘密。破解的第一步,他很想知道,在这串数字中,最多可以挑出多少个‘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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值