子序列

算法设计竞赛

习题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标记的使用与多个循环终止条件

发布了7 篇原创文章 · 获赞 3 · 访问量 287

猜你喜欢

转载自blog.csdn.net/Anterior_condyle/article/details/104173611
今日推荐