题目链接: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
"
#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
");
continue;
}
if(check())
printf("Yes
");
else
printf("No
");
}
return 0;
}