http://bailian.openjudge.cn/practice/1936/
描述
你设计了一个新的加密技术,可以用一种聪明的方式在一个字符串的字符间插入随机的字符串从而对信息进行编码。由于专利问题,我们将不会详细讨论如何在原有信息中产生和插入字符串。不过,为了验证你的方法,有必要写一个程序来验证原来的信息是否全在最后的字符串之中。
给定两个字符串s和t,你需要判断s是否是t的“子列”。也就是说,如果你去掉t中的某些字符,剩下字符将连接而成为s。
输入
输入包括多个测试样例。每一个都是由空格分隔的由字母数字ASCII字符组成的两个特定的字符串s和t。s和t的长度不超过100000。
输出
对于每个测试样例,如果s是t的“子列”,则输出”Yes”,否则输出”No”
样例输入
sequence subsequence person compression VERDI vivaVittorioEmanueleReDiItalia caseDoesMatter CaseDoesMatter
样例输出
Yes No Yes No
来源
Ulm Local 2002
#include<stdio.h>
#include<string.h>
#define M 100000
int main()
{
char ch1[M+1],ch2[M+1];
while(scanf("%s %s",ch1,ch2) == 2)
{
int len1,len2,i,j,k;
len1=strlen(ch1);
len2=strlen(ch2);
k=j=0;
for(i=0;i<len1;++i)
{
if(j==len2)
break;
for(;j<len2;j++) //j一直加,从而使顺序不变
{
if(ch1[i]==ch2[j])
{
k++;
j++;
break;
}
}
}
if(k==len1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
以下Java解答报 Runtime Error, 具体原因不明.
import java.util.Scanner;
public class OpenJudge1936 {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
String line = "";
while (!(line = cin.nextLine()).equals("")) {
String plain = line.split(" ")[0];
String cipher = line.split(" ")[1];
boolean contained = true;
int j = 0;
for (int i = 0; i < plain.length(); i++) {
boolean found = false;
// Note that only start from 0 for the first character in plain
for (; j < cipher.length(); j++) {
if (plain.charAt(i) == cipher.charAt(j)) {
found = true;
j++;
break;
}
}
if (!found) {
contained = false;
break;
}
}
if (contained) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
cin.close();
}
}