版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41117236/article/details/82944440
【题目】
【题意】
给出模式串和主串,问需要多少个模式串拼接删去多余部分可得到主串。若不存在答案则输出-1。
【思路】
若是主串中出现模式串中没有的字母,则不存在。
模拟匹配,统计次数。
【代码】
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <map>
#include <set>
#include <list>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
#define mem(a) memset(a,0,sizeof(a))
#define go(i,a,b) for(int i=a;i<=b;i++)
#define og(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=10000;
const int inf=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
main()
{
set <int> a[30];
string s1,s2; cin>>s1>>s2;
int l1=s1.size(),l2=s2.size();
go(i,0,l1-1) a[s1[i]-'a'].insert(i);
int f=1,n=-1,ans=1;
go(i,0,l2-1)
{
int m=s2[i]-'a';
if(a[m].empty()) f=0; //判断是否可行
set <int> :: iterator it=a[m].upper_bound(n);
if(it==a[m].end()) n=-1,ans++; //若匹配到模式串末尾,更新位置n
n=*a[m].upper_bound(n);
}
if(f) cout<<ans<<endl;
else cout<<"-1\n";
}