版权声明:虽然我只是个小蒟蒻但转载也请注明出处哦 https://blog.csdn.net/weixin_42557561/article/details/81942290
字符串
【描述】
给定两个字符串 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。
分析
哇。。。。。。好高兴好高兴,第一次A题了,说明这道题确实不难
我就不详细解释了
我们将 s 和 t 划分为若干个极长段,满足每段以字母开头且段内只有一种字母。显然这些段是一一对应的,对于 s 中每一段,如果有 * ,那么它可以变为字母个数>=它的全字母段。
时间复杂度O(T(|s|+|t|))
代码
考场代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define in read()
#define N 30005
using namespace std;
inline int read(){
char ch;int f=1,res=0;
while((ch=getchar())<'0'||ch>'9')if(ch=='-') f=-1;
while(ch>='0'&&ch<='9'){res=(res<<3)+(res<<1)+ch-'0';ch=getchar();}
return f==1?res:-res;
}
struct node{int l,num;char st;}a[N],b[N];
int numa,numb,T;
char s[N];
int main(){
// freopen("string.in","r",stdin);
// freopen("string.out","w",stdout);
T=in;
for(int tt=1;tt<=T;++tt){
scanf("%s",s);
int lens=strlen(s),i,j=0,cnt=0,pre=0;
s[lens]='!';
char k;
while(s[j]=='*') j++;
k=s[j];
for(i=j+1;i<=lens;++i){
if(s[i]=='*') cnt++;
if(s[i]!=k&&s[i]!='*'){
a[++numa].l=i-pre;
a[numa].num=cnt;
a[numa].st=k;
cnt=0;k=s[i];pre=i;
}
}
scanf("%s",s);
lens=strlen(s);pre=0;s[lens]='!';
k=s[0];
for(i=1;i<=lens;++i){
if(s[i]!=k){
b[++numb].l=i-pre;
b[numb].st=k;
k=s[i];pre=i;
}
}
if(numb>numa) { printf("No\n");numa=0;numb=0;continue;}
if(numa>numb) { printf("No\n");numa=0;numb=0;continue;}
for(i=1;i<=numb;++i){
if(i>numa) break;
if(b[i].st!=a[i].st) break;
if(b[i].l>a[i].l){
if(a[i].num==0) break;
}
if(b[i].l<a[i].l){
if(a[i].num==0) break;
if(a[i].num<(a[i].l-b[i].l)) break;
}
}
if(i<=numb||i<numa) printf("No\n");
else printf("Yes\n");
numa=0;numb=0;
}
// fclose(stdin);fclose(stdout);
return 0;
}
老师给的std,看看这码风就知道读不懂了
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int T,n,m;
char s[30010],t[30010];
int main(){
freopen("string.in","r",stdin);
freopen("string.out","w",stdout);
int i,j,k,l,u;
scanf("%d",&T);
while(T--) {
scanf("%s%s",&s,&t);
n=strlen(s);
m=strlen(t);
for(i=j=0;i<n;i=k,j=l) {
u=0;
for(k=i;k<n && (s[k]=='*' || s[k]==s[i]);k++)
if(s[k]=='*')
u++;
for(l=j;l<m && t[l]==t[j];l++);
if(!(s[i]==t[j] && k-i-u<=l-j && (u || k-i==l-j)))
break;
}
if(i<n || j<m)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}