解法一
时间复杂度:$O(n)$,n为主串a的长度
基本想法就是求出子串c(相当于题目的s1)在a(相当于题目的s)中第一次匹配的终止匹配坐标l
子串c(相当于题目的s2)在a中最后一次匹配起始坐标r-c.size()+1
如果起始坐标<终止坐标,那么显然不存在
或者只匹配到其中一个子串或两个子串都没有匹配,那么显然也是不存在的
#include<iostream>
using namespace std;
int main()
{
string a,b,c;
int t=0,size=0,l=-1,r=-1;
char c1;
while (cin >> c1, c1 != ',') a += c1;
while (cin >> c1, c1 != ',') b += c1;
while (cin >> c1) c += c1;
for(int i=0;i<a.size();i++)
{
//匹配s1
if(t<b.size() && b[t]==a[i]) size++,t++;
else if(t<b.size() && b[t]!=a[i]) t=0,size=0;
if(size==b.size()){
l=i;
break;//第一次匹配到就退出
}
}
//cout<<l<<endl;
t=0,size=0;
for(int i=0;i<a.size();i++)
{
//匹配s2
if(t<c.size() && c[t]==a[i]) size++,t++;
else if(t<c.size() && c[t]!=a[i]) t=0,size=0;
if(size>=c.size()){
r=max(i,r);
t=0;
}
}
//cout<<r-c.size()+1<<endl;
if(l==-1 || r==-1 || l>r-c.size()+1) cout<<-1<<endl;
else cout<<r-c.size()+1 - l -1<<endl;
return 0;
}
注意这题用getline(cin,a,”,”)的时候,调试的时候没问题,提交的时候有时候会出问题,最好换种输入方式