习题3-9 子序列 UVa10340
感悟。
1、上网站下载英文原题,仔细阅读,有些疑惑未解,但自觉不影响编程,稍作思考,开始写代码。
2、像吃豆腐一样简单,很快就完成编码,但一测试样例,大量的通不过,开始跟踪代码。
3、便跟踪边写代码,代码写完,题意也就理解得差不多了,提交Runtime error。
4、将数组从1000开到10000,提交Runtime error,将数组从10000开到100000,提交WA。
5、UVa里几乎没有菜题,一次就AC,好难啊。
6、凭自身实力已无法改正WA,有什么遗漏呢?参考http://blog.csdn.net/thudaliangrx/article/details/50699439代码这么短,都能AC。给了很大的信心。
7、无意中想到一组无法测试通过的数据
AAA ABCD
Yes
马上想到问题所在,修改代码,提交AC,眼泪都快掉下来了,太不容易了,尤其是想到无法通过测试的数据。
附上代码
环境Dev-cpp4.9.9.2
#include <stdio.h>
#include <string.h>
char sub[100000],s[100000];
int book[100000];
int main(){
int sublen,slen;
int i,j;
int flag;
int min;
while(scanf("%s%s",sub,s)!=EOF){
sublen=strlen(sub);
slen=strlen(s);
memset(book,-1,sizeof(book));
min=0;
for(i=0;i<sublen;i++){//根据子串扫描父串,若找到则对book进行标记
for(j=min;j<slen;j++){//用过字符之后的字符才有效
if(sub[i]==s[j]){
book[i]=j;
min=j+1;//min为当前所用字符的后面一位。WA变为AC,只是修改了min=j;变为min=j+1;
break;
}
}
}
flag=1;
for(i=0;i<sublen;i++){
if(book[i]==-1){//没找到该字符
flag=0;
break;
}
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}