题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5414
题意:给你两个字符串s和t,你可以在字符串s中任意选一个字符c,在该字符c后插入一个字符d(d!=c),问经过多次此操作,能否将字符串s转化成字符串t
思路:初读题理解错题意,以为只能在原串的每个字符后面添加一个不同于这个字符的一个字母,事实上可以重复操作,比如,ap,转换成axxp,可以先在a后面添加一个x,就变成了axp,再次操作,在a后面添加一个x,就可以变成axxp。
换句话说:就是保证若第二个字符串t前k个字符都相同,那么第一个字符串s的前k个字符也必须相同(1),剩下的,即使出现插入的字母和前一个字符相同,我们也可以理解成前一个字符是插在前面那个字符的后一个的字符(2),好吧,说晕了,举个栗子:apple,转换成appple,如果第二个p是插入到p后面的字符,按照题目要求是不可以的,但是同时我们可以把第一个p当成插在a后面的字符,这样就符合条件了,这就是之前(2)的解释;再举个栗子:apple,转换成aapple,后一个字符串前两个字符都是a,而第一个字符串只有一个a字符,这样第二个字符串中的第二个字符a就必须是a后面插入的,这样明显就不符合条件,ok,(1)解释完了。。
具体操作步骤,就是先保证若字符串t前k个字符都相同,那么字符串s的前k个字符也必须相同,然后在剩下的字符串中按顺序找到第一个字符串的每个字母就行
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <cctype>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <sstream>
#include <fstream>
#define debug "output for debug\n"
#define pi (acos(-1.0))
#define eps (1e-8)
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
const int maxn = 100005;
char str1[maxn],str2[maxn];
int l1,l2;
int check()
{
int i,j;
for(i=0;i<l2;i++)
{
if(str2[i]!=str2[0])
break;
}
for(j=0;j<i;j++)
{
if(str1[j]!=str2[j])
return 0;
}
while(j<l1)
{
for(;i<l2;i++)
{
if(str1[j]==str2[i])
break;
}
if(i==l2)
return 0;
i++;
j++;
}
return 1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s%s",str1,str2);
l1=strlen(str1);
l2=strlen(str2);
if(l2<l1)
{
printf("No\n");
continue;
}
if(check())
printf("Yes\n");
else
printf("No\n");
}
return 0;
}