最近一直没怎么上博客,今天就写到题吧。
题目描述:
给定两个字符串s和t,请判断s是否是t的子序列。即从t中删除一些字符,将剩余的字符连接起来,即可获得s。
输入描述:
包括若干组测试数据。每组测试数据由两个ASCII码的数字和字母串s和t组成, s和t的长度不超过100000。
输出描述:
对每组测试数据,如果s是t的子序列则输出Yes;,否则输出No。
样例输入:
sequence subsequence
person compression
caseDoesMatter CaseDoesMatter
样例输出:
Yes
No
No
要注意这句话:**即从t中删除一些字符,将剩余的字符连接起来,即可获得s。**一开始没注意到这句话就按照字符串匹配写的,用的BF算法,效率是低了点,最差是O(M*N)吧,然后是wrong answer 后来发现这句话,改了一下就行了。代码可以简化一下,不过都差不多。
#include<stdio.h>
#include<string.h>
int BF(char *s,char *t)
{
int i,j,len1,len2,result;
len1=strlen(s);
len2=strlen(t);
i=j=0;
while(i<len1&&j<len2)
{
if(s[i]==t[j])
{
i++;
j++;
}
else
{
j++; //如果是字符串匹配 那么这里可以写成 j=j-i+1; i=0;
}
}
if(i==len1)
{
result=1;
}
else
{
result=0;
}
return result;
}
int main()
{
char s[10000],t[10000];
int k;
while(scanf("%s %s",&s,&t)!=EOF)
{
k=BF(s,t);
if(1==k)
{
printf("Yes\n");
}
else if(0==k)
{
printf("No\n");
}
}
return 0;
}