标签:
题意:给两个字符串a,b,问是否可以将a串变成b串。只有一种操作,即选择a串的一格字符c,在c后面添加一个字符d,要求d和c不同。操作可以进行很多次,也可以不进行。保证a,b非空且a的长度不过b的长度。
解法:(千万别想麻烦了)显然如果第一个字符不同,就无解;设两个指针t1,t2分别指向a,b,t1 t2 从0开始扫,发现不同则退出,发现s2[t2 - 1] != s2[t2] (t2 > 0) 则退出。。此时如果t2指向len2则有解,如果t2指向0则无解,如果s2[t2 - 1] == s2[t2]则无解,否则,判从t1开始的s1的后缀是否是从t2开始的s2的后缀的子序列。。没了。
My code
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define N 100010
char s1[N],s2[N];
int lens1,lens2;
bool judge(){
if(s1[0] != s2[0]) return false;
int t1 = 0, t2 = 0;
for(; t1 < lens1;){
if(t2 > 0 && s2[t2 - 1] != s2[t2]) break;
if(s1[t1] != s2[t2]) break;
t1++, t2++;
}
if(t2 == lens2) return true;
if(t2 == 0) return false;
if(s2[t2 - 1] == s2[t2]) return false;
for(; t1 < lens1 && t2 < lens2;){
if(s1[t1] == s2[t2]) t1++;
t2++;
}
if(t1 == lens1) return true;
else return false;
}
int main(){
int T;
scanf("%d",&T);
for(int kase = 1; kase <= T; kase++){
scanf("%s%s",s1,s2);
lens1 = (int)strlen(s1), lens2 = (int)strlen(s2);
printf("%s\n",judge()?"Yes":"No");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/uestc_peterpan/article/details/47813479