实验任务
小光头找到小菇凉后发现他们被困在一个奇怪里结界里找不到原来的路回家去了,于是小光头打算带着小菇凉往森林深处走去寻找一条新的道路。在森林入口,他们发现了一块石壁,上面有一些奇怪的符号,写的是如果解除封印就能存档,即使在森林里遭遇不测也可以重新来过(红豆泥?o_O?!)。
解除封印需要在一串字符串中找出是否包含另一个串的子序列。如果包含则这个封印可以解除,否则则不可以解除。
数据输入
输入有多组数据,每组包含两个字符串 t 和 s,字符串长度不超过 100000。
数据输出
输出若字符串 s 包含一个子序列 s’与 t 相同,则输出 Yes,否则输出 No。
输入示例
sequence subsequence
person compression
VERDI vivaVittorioEmanueleReDiItalia
caseDoesMatter CaseDoesMatter
输出示例
Yes
No
Yes
No
解题思路
对于t中每个元素t[i],按顺序查找是否有s[j] == t[i].若相等的次数等于t中元素的个数,则说明存在s’
参考代码
#include <stdio.h>
#include <string.h>
const int maxn = 100010;
char t[maxn],s[maxn];
bool find ();
int main()
{
while (~scanf("%s %s",t,s))
printf("%s\n",find()?"Yes":"No");
return 0;
}
bool find (){
int len1 = strlen(t),len2 = strlen(s);
bool flag;
int cnt = 0,pos = 0;
int i,j;
for (i = 0;i < len1;i++){
for (j = pos;j < len2;j++)
if (t[i] == s[j]){
cnt++;
break;
}
pos = j;
}
return (cnt == len1?true:false);
}