题目描述
给定两个字符串s和t,判断s是否是t的子序列。即从t中删除一些字符,将剩余的字符连接起来,即可获得s。
输入
输入文件包括多组测试数据,每组测试数据占一行,包括两个由ASCII码组成的字符串s和t,它们的长度都不超过100000。
输出
对于每个测试数据输出一行,如果s是t的子序列,则输出“Yes”,否则输出“No”。
样例输入 复制
sequence subsequence person compression VERDI vivaVittorioEmanueleReDiItalia caseDoesMatter CaseDoesMatter
样例输出 复制
Yes No Yes No
我出现了奇怪问题的代码
是子序列先后顺序的问题
#include<stdio.h>
#include<string.h>
char s[100005];
char t[100005];
int main()
{
while(scanf("%s %s",s,t)!=EOF)
{
//m<n;
int m=strlen(s);
int n=strlen(t);
int flag=1;
int o,p;
p=0;
for(int i=0;i<m&&flag;i++)
{
flag=0;
for(int j=0;j<n;j++)
{
if(s[i]==t[j])
{
if(j<p)
{
flag=0;
}
else
{
flag=1;
}
p=j;
break;
}
}
}
if(!flag)
printf("No\n");
else
printf("Yes\n");
}
}
正确的 简洁的代码
//这样的话,就只能往后找了,不能是乱序的,只能是有序的,因为是删除一些字符,而不是可以调整字符的顺序。
下面程序的主要思路是
一个一个比对,比对成功后,就只能比对后面的字符串,最后算总长度,如果总长度是和s的长度一致的,则正确的。
#include <stdio.h>
#include <string.h>
const int MAX_N = 100005;
char s[MAX_N], t[MAX_N];
int main()
{
while (scanf("%s %s", s, t) != EOF)
{
int i = 0, j = 0;
while (i < strlen(s) && j < strlen(t))
{
if (s[i] == t[j])
{
i++;
}
j++;
}
if (i == strlen(s))
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}