大家好我正在做一个问题。问题是:
"给你一个字符串“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;
}
答案 0 :(得分:0)
您可以通过字符串begin() + x
和begin() + 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。