题目
字符串string.cpp
【描述】
给定两个字符串s,t,其中s 只包含小写字母以及*,t 只包含小写字母。
你可以进行任意多次操作,每次选择s 中的一个*,将它修改为任意多个(可以是0 个)它
的前一个字符。问是否能将s 修改为t。
有多组数据。
【输入】
第一行一个整数T 表示数据组数。
每组数据两行,第一行一个字符串s,第二行一个字符串t。
【输出】
每组数据输出一行,如果能将s修改为t,输出Yes,否则输出No。
【输入样例】
2
a*
aaaa
a*
ab
【输出样例】
Yes
No
【子任务】
对于20%的数据,|s|,|t|<=7。
对于60%的数据,|s|,|t|<=300。
对于100%的数据,T<=100,|s|,|t|<=30000。
很简单的一道模拟题,只不过要考虑的情况很多,也不好调,多对着大数据对拍几次,把所有的情况都考虑到就好了;
#include<bits/stdc++.h>
using namespace std;
int T,lena,lenb;
char s[30005],t[30005];
bool ans=true;
inline void then(int &a,int &b){
int f=a-1,k=b,c=0;
while((s[a]=='*'||s[a]==s[f]))
{
if(s[a]=='*') c++;
a++;
}
while(s[a]==s[f]) a++;
while(s[f]==t[b]) b++;
if((b-k)<(a-f-1-c)) ans=false;
}
int main(){
scanf("%d",&T);
while(T--)
{
cin>>s+1;
cin>>t+1;
lena=1,lenb=1;
while((s[lena]<='z'&&s[lena]>='a')||(s[lena]=='*')) lena++;
lena--;
while(t[lenb]<='z'&&t[lenb]>='a') lenb++;
lenb--;
int x=1,y=1,num=0;
for(int i=1;i<=lena;i++){
if(s[i]=='*') num++;
}
if(lena>lenb+num)
{
cout<<"No"<<endl;
continue;
}
ans=true;
while(x<=lena&&y<=lenb&&ans)
{
if(s[x]!='*')
{
if(s[x]==t[y])
{
x++,y++;
}
else
{
ans=false;
break;
}
}
else
{
then(x,y);
}
}
while(x<=lena&&s[x]=='*') x++;
if(x<=lena||y<=lenb)
ans=false;
if(ans) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}