算法设计竞赛
习题3-9 子序列(All in All, UVa 10340)
输入两个字符串s和t,判断是否可以从t中删除0个或多个字符(其他字符顺序不变), 得到字符串s。例如,abcde可以得到bce,但无法得到dc。
分析:题意实则可以转化为在 t字符串中按顺序寻找 s字符串中的字符,则 t字符串个数必须大于 s字符串个数,依次取 s中字符与 t中字符依次比较,用 len来标记比较结果,若某个字符在 t中为找到未找到,则必定会遍历到空字符,此时输出 NO,程序结束;反之继续循环比较下一个。
C语言代码如下:
#include<stdio.h>
#include<string.h>
char s[10005],t[10005];
int main()
{
int a,b,len=0,n=0;//len用来标记是否找到
scanf("%s",s);
a=strlen(s);
scanf("%s",t);
b=strlen(t);
if(a<=b)//s序列长度必须小于t序列长度
{
for(int i=0;i<a;i++)//依次取s序列字符
for(int j=n;j<b;j++)//j=n,下一个字符只需遍历t后面字符即可
{
if(s[i]==t[j])//判断当前两字符是否相等
{
n=j;
len=1;
break;
}
if(t[j+1]=='\0')
{//当t序列取不到相应字符时,程序终止
printf("NO\n");
return 0;
}
}
if(len==1)
printf("yes\n");
else
printf("NO\n");
}
else
printf("NO\n");
return 0;
}
思考:题目突破口在len标记的使用与多个循环终止条件