ACM解题之回文序列

题意:

一个长度为 n 的序列 a1, m2, ..., an-1, an,如果 ai = an-i+1, i = 1, 2, ..., n,则称之为“回文序列”。本题对于给定的一个序列,请判断其是否回文序列。有多个测试用例。每个测试用例占两行,第一行是一个正整数 n,表示待测试序列有 n 项。第二行是待测试序列,序列的项以一个空格分隔,但是,如果序列项是字符,则没有分隔的空格。输入直至没有数据为止。对于每个测试用例,输出一行,如果输入序列是回文序列,则输出 YES,否则输出 NO.

解题:C++/Accepted/332k/0ms

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main() {
	int n;
	while (cin >> n) {
		string strr;
		getline(cin, strr);
		string str;
		getline(cin, str);
		int num = str.length();
		vector<string> vec;
		string s;
		for (int i = 0;i < num;i++)//将字符串按空格分割
		{
			if (str[i]== ' ')//遇到空格,说明上一个字已经完整了,将它放进句子的数组
			{
				vec.push_back(s);
				//while (!s.empty())
					//s.pop_back();
				s ="";
			}
			else
				s.push_back(str[i]);
		}
		vec.push_back(s);
		bool isin = true;  //标记
		if (vec.size() == 1)//说明输入没有空格
		{
			for (int k = 0;k < num/2;k++)
				if (str[k] != str[num - 1 - k])  //按第一个和最后一个,第二个和倒数第二个...字符比较,如果存在某一对不同,则标记为假,且退出
				{
					isin = false;
					break;
				}
			if (isin)  //如果标记为真,则说明没有对应不同的字符
				cout << "YES" << endl;
			else
				cout << "NO" << endl;
		}
		else
		{    //这里比较的是相对应位置的字,原理和上面一样
			for (int k1 = 0;k1 < vec.size() / 2;k1++) 
				if (vec[k1] != vec[vec.size() - 1 - k1])
				{
					isin = false;
					break;
				}
			if (isin) //如果标记为真,则说明没有对应不同的字
				cout << "YES" << endl;
			else
				cout << "NO" << endl;
		}
	
	}
	return 0;
}

【原创声明】转载请标明出处:https://www.cnblogs.com/surecheun/
原文地址:https://www.cnblogs.com/surecheun/p/9648984.html