每组两个串s t 仅仅由小写字母组成 问从s能不能变成t
改变的操作为选一个字符 在后面加上一个与所选字符不同的字符
这样的操作能够做无数次 问能不能达t
首先s能到t的首要条件是 对于随意字母 s中出现的次数小于等于t中出现的次数
其次细致想想能够发现 满足上一条件后 假设不存在连续的同样字符 s肯定能变成t(细致想想
而同样的连续字符假设在串中(不在串首 可不断在其前的字符后累加该字符
因此仅仅需看t开头有没有连续的同样字符 假设与s开头连续的同样字符为同一字符 而且长度小于等于s开头的连续同样字符长度
即为Yes
不满足以上两个条件 即为No
代码例如以下:
#include <iostream>
#include <cstring>
#include <cstdio> using namespace std; using namespace std; char s[100005],t[100005];
int sz[26],tz[26]; int main()
{
int T,i,j,lens,lent;
bool f;
scanf("%d",&T);
while(T--)
{
scanf("%s %s",s,t);
if(s[0] != t[0])
{
puts("No");
continue;
} memset(sz,0,sizeof(sz));
memset(tz,0,sizeof(tz));
lens = lent = 0;
f = 0;
for(i = 0; s[i]; ++i)
{
sz[s[i]-'a']++;
if(!f && (!i || s[i] == s[i-1])) lens++;
else f = 1;
} f = 0;
for(i = 0; t[i]; ++i)
{
tz[t[i]-'a']++;
if(!f && (!i || t[i] == t[i-1])) lent++;
else f = 1;
} if(t[0] == s[0] && lens >= lent)
{
for(i = 0; i < 26; ++i)
{
if(sz[i] > tz[i]) break;
}
if(i == 26) puts("Yes");
else puts("No");
}
else puts("No");
}
return 0;
}