题目大意
给定两个字符串
S
和
你每次可以在
S
的某个字符
问有没有可能把
S
变成
1≤|S|≤|T|≤105 。
题目分析
老年选手已经想不动这些思维题了qwq。
考虑贪心地从后往前匹配字符,如果一样就前移,不一样就在
S
的这个位置加一个。
为什么要从后往前呢?因为这样就一定能够保证加入的字符合法。
什么时候这个贪心不能匹配完所有字符呢?首先如果
如果没有这些情况显然一定可以贪心匹配完。
时间复杂度
O(|S|+|T|)
。
代码实现
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int L=100050;
char s[L],t[L];
int T,n,m;
int main()
{
freopen("crbstring.in","r",stdin),freopen("crbstring.out","w",stdout);
for (scanf("%d",&T);T--;)
{
scanf("%s",s),n=strlen(s),scanf("%s",t),m=strlen(t);
if (s[0]!=t[0]) printf("No\n");
else
{
bool judge=1;
for (int i=1;i<m&&t[i]==t[i-1];++i)
if (s[i]!=s[i-1])
{
judge=0;
break;
}
if (!judge) printf("No\n");
else
{
int cur=0;
for (int i=0;cur<n&&i<m;++i) cur+=s[cur]==t[i];
if (cur==n) printf("Yes\n");
else printf("No\n");
}
}
}
fclose(stdin),fclose(stdout);
return 0;
}