版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15046309/article/details/82528703
描述
给定两个字符串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
分析:子串的问题并不困难,上次在哪里找到的字母,下一次就从他开始(不包括他)开始找就可以了。思路非常简单,注意细节。
说实话,我挺好奇这个OJ系统是怎么终结的,因为题目中没有告诉你会测试多少组数据。因此在C++中,我的判断条件是
while(cin>>a>>b)
显而易见在本地是无法结束循环的,OJ应该是用命令终结掉的。
#include<iostream>
#include<string>
using namespace std;
bool judg(string a, string b) {
int k = 0;
bool you = true;
for (int i = 0; i <a.length(); i++)
{
you = true;
for (int j = k; j < b.length(); j++)
{
if (a[i]==b[j])
{
k = j+1;//注意这里是j+1。因为下一个寻找是从j的下一个开始的,不是j。这个bug我找了好久,最后出去散散心,猛然醒悟了。
you = false;
break;
}
}
if (you)
{
return false;
}
}
return true;
}
int main()
{
string a, b;
while (cin >> a >> b)
{
if (judg(a, b)) {
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
}
}