标签:
原题如图所示,之前笔试的时候没有想出来,今天突然看见了,所以就动手试了试。这个题的意思相信上面已经表达清楚了,下面我就直奔主题。
第一眼见到这个题的时候,满脑子想的是循环匹配。要是精力集中在怎么去匹配,那么这个题多半是做不出来了,因为循环会将你引导一条错误的方向上。我也执着于怎么去匹配,执着了好久还是觉得时间复杂度上无法达标,这个时候我就在草稿纸上写了几个例子,于是发现了一些特点。
其实我们只需要保留一个单词的第一个字母和最后一个字母就行了(其他的字母对于解题来说么有任何意义,只会增加解题负担),但是单词的长度可能为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