All in All

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_15046309/article/details/82528703
ALL