标签:
原题如图所示,之前笔试的时候没有想出来,今天突然看见了,所以就动手试了试。这个题的意思相信上面已经表达清楚了,下面我就直奔主题。
第一眼见到这个题的时候,满脑子想的是循环匹配。要是精力集中在怎么去匹配,那么这个题多半是做不出来了,因为循环会将你引导一条错误的方向上。我也执着于怎么去匹配,执着了好久还是觉得时间复杂度上无法达标,这个时候我就在草稿纸上写了几个例子,于是发现了一些特点。
其实我们只需要保留一个单词的第一个字母和最后一个字母就行了(其他的字母对于解题来说么有任何意义,只会增加解题负担),但是单词的长度可能为1(长度为1的时候可以直接不用考虑,这点相信大家可以明白),理清了解题的障碍,下面我们就开始解题!
我的思路是统计单词首尾字母出现的次数,最后有两种情可以说明满足条件:
1.除了两个字母出现的次数为奇数外,其他字母出现的次数均为偶数(中间的满足接龙条件,剩下开头和结尾两个字母,他们不同)
2.所有字母出现的次数都为偶数(上面的情况中,最后的开头和结尾是相同的)
下面是代码的实现:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void SolveStr(vector<string>& Vstr){
if (Vstr.size() == 0){
cout << "Yes" << endl;
return;
}
//Vstr中的所有项目都成为了[k,v]的键值对
int size = Vstr.size();
int arr[256] = { 0 };
for (int i = 0; i < size - 1; ++i)
{
arr[Vstr[i][0]]++;
arr[Vstr[i][1]]++;
}
int signum = 0;
for (int i = 0; i < 256; i++)
{
if (arr[i] != 0 && arr[i] % 2 != 0)
{
++signum;
}
}
if (signum == 0 || signum == 2)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
int main(){
int n = 0;
while (cin >> n){
vector<string> Vstr;
//Vstr.resize(n);
for (int i = 0; i< n; ++i){
string tmp;
cin >> tmp;
if (tmp.size() > 1){
string str;
str.push_back(tmp[0]);
str.push_back(tmp.size() - 1);
Vstr.push_back(str);
}
}
SolveStr(Vstr);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/zr1076311296/article/details/52270356