题目描述
输入两个字符串s和t,判断是否可以从t中删除0个或者多个字符(其他字符顺序不变),得到字符串s。例如,abcde可以得到bce,但无法得到cb。
Input输入多组数据
每组一行包含两个字符串s和t,两字符串之间用空格隔开。
字符串长度在100000以内
Output输出Yes或No
Sample Inputsequence subsequence
person compression
VERDI vivaVittorioEmanueleReDiItalia
caseDoesMatter CaseDoesMatterSample Output
Yes
No
Yes
No
迷之卡题,num = j + 1,这个地方改了一下就过了,惊了,原来是这个原因
之前有的字母已经比较过了,写num = j,相当于又比较了一遍
#include
#include
char s[100000];
char t[100000];
int main(void)
{
while(scanf("%s", s) != EOF && scanf("%s", t) != EOF){
int lens, lent;
lens = strlen(s);
lent = strlen(t);
int i, j, num = 0, flag = 0, val = 0;
for(i = 0; i < lens; i++){
flag = 0 , val = 0;
for(j = num; j < lent; j++){
if(t[j] == s[i]){
num = j + 1;
flag = 1;
break;
}
}
if(flag)
val = 1;
else
break;
}
if(val)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
不得不说还是单条链遍历比较好,我这种做法容易出错,而且定义了两个flag变量(flag , val)来进行判断很繁琐
其实定义一个长度变量如len,能从t中找到s的顺序字符就加1,最后比较s的长度和len的大小也可以另一种相对简洁的做法
#include
#include
char s[100000];
char t[100000];
int main(void)
{
while(scanf("%s", s) != EOF && scanf("%s", t) != EOF){
int lens, lent;
lens = strlen(s);
lent = strlen(t);
int i, j, len = 0;
for(i = 0, j = 0; i < lens && j < lent;){
if(s[i] == t[j])
i++, j++, len++;
else
j++;
}
if(len == lens)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}