非重叠子字符串的最大数量

时间:2014-10-20 15:10:21

标签: c++

大家好我正在做一个问题。问题是:

"给你一个字符串“S”和一个模式“P”。你必须找到FS(x,y),它被定义为非重叠子串的最大数量,它等于子串中的模式“P”

S的

从x开始到y结束(x,y在0基本索引中)。

假设,

S =“abcdef”

P =“cd”

,查询为(1,5),因此子字符串为“bcdef”,FS(1,5)= 1"

我正在使用一种方法,其中我的代码计算x和y之间存在的模式P的数量,但我有点困惑,因为问题陈述说,计算"最大"非重叠子串的数量。我认为这里的最大值是为了混淆而写的,没有意义,因为我找不到任何反案例。如果我认为错了,请回复。

如果您想要问题的链接: - LINK

或者您想查看我的代码: - CODE

//this is my code
#include "iostream"
#include "string"
#include "cstring"
#include "cstdlib"
#include "algorithm"
#include "cstdio"
using namespace std;

  #define gc getchar_unlocked

  void scanint(int &x)                      //fast input 
  {
    register int c = gc();
    x = 0;
    for(;(c<48 || c>57);c = gc());
    for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}
  }

  int main(int argc, char const *argv[])
  {
    int t,q,i,j,c=0,h,x;    string s;
    cin>>t;
    getline(cin,s);
    for(x=1;x<=t;x++)
    {cout<<"Case "<<x<<":"<<endl;
    string p,z;
    getline(cin,s);
    getline(cin,p);
    scanint(q);

    while(q--)
    {
        scanint(i);scanint(j);c=0;z.clear();
        for(h=i;h<=j;h++)
        {
            if(s[h]==p[0])
            {
                    if(p.length()==1)
                    z=s.substr(h,p.length());
                else if(p.length()<=(j-h)+1)
                    z=s.substr(h,p.length());
                    if(!z.compare(p))
                    {
                        c++;h=h+p.length()-1;
                    }

            }   
        }
        cout<<c<<endl;
    }
}

return 0;
}

2 个答案:

答案 0 :(得分:0)

您可以通过字符串begin() + xbegin() + y获取您感兴趣的范围。之后,只要std::search返回除结束迭代器之外的其他内容,只需迭代即可。

答案 1 :(得分:0)

您可以将regex用于此目的,只需构造sregex_iterator(您必须为其提供正则表达式模式和字符串子范围,您要在其中搜索此模式的出现)并迭代它:

#include <iostream>
#include <string>
#include <regex>

using namespace std;

int substr_occurences(string str, int start_idx, int end_idx, string pattern)
{
    const regex reg("(" + pattern + ")");
    int occurences = 0;

    sregex_iterator it(str.begin() + start_idx, str.begin() + 1 + end_idx, reg);
    sregex_iterator it_end;

    while(it != it_end)
    {
        ++occurences;
        cout << (*it)[1] << endl;
        it++;
    }

    return occurences;
}

如果您不熟悉C ++中的正则表达式,请查看this video