全在其中(POJ NO.938)
总时间限制: 1000ms
内存限制: 65536kB
Question
Description
你设计了一个新的加密技术,可以用一种聪明的方式在一个字符串的字符间插入随机的字符串从而对信息进行编码。由于专利问题,我们将不会详细讨论如何在原有信息中产生和插入字符串。不过,为了验证你的方法,有必要写一个程序来验证原来的信息是否全在最后的字符串之中。给定两个字符串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
My Hints
Algorithm
此题为字符串的模式匹配问题,只是s可以分散在t中,注意到这一点,程序变很快能写出来。
Codes
@ hzhang_97@foxmail.com
// Author: Florence
// Created Time: 2017-08-15 18:15:32
#include <iostream>
#include <cstring>
using namespace std;
string s,t;
int main(int argc, char** argv) {
while (cin >> s >> t){
//i为s当前的索引,j为t当前的索引
string::size_type i = 0,j;
//从s的第一个字母开始对t匹配
for (j = 0;i != s.size() && j != t.size();j++){
//s的一个字母匹配成功后,索引值加一对下一个字母进行匹配
if (s[i] == t[j]){
i++;
}
}
//若最后i值为s字符串长度,则说明全部匹配
if (i == s.size()){
cout << "Yes" << endl;
}else{//否则s不为t子串
cout << "No" << endl;
}
}
return 0;
}
此题为简单字符串的模式匹配问题。