题目链接: 对称之美
创建一个二维数组, n 行 26 列, 每一行存储按顺序输入的字符串的字母出现的次数, 然后通过两个变量 left, right, 一个从前一个从后依次判断两个字符串是否存在相同的字母, 根据结果判断是否有可能为回文字符串, 图示:
第一次遍历找到了共同的 'a', 第二次遍历找到了共同的 'f', 遍历结束, 判断出可以组成回文串, 题解代码如下:
#include <iostream>
#include <vector>
using namespace std;
//判断字符串是否有可能为回文字符串
bool is_palindrome(const vector<vector<int>>& hash)
{
int left = 0;
int right = hash.size() - 1;
while(left < right)
{
int i = 0;
for( ; i < 26; ++i)
{
if(hash[left][i] && hash[right][i])
{
break;
}
}
if(i == 26)
{
return false;
}
left++;
right--;
}
return true;
}
int main()
{
int n;
cin >> n;
while(n--)
{
int m;
cin >> m;
vector<vector<int>> hash(m, vector<int>(26));
string str;
for(int i = 0; i < m; ++i)
{
cin >> str;
for(auto& e : str)
{
hash[i][e - 'a']++;
}
}
cout << (is_palindrome(hash) ? "Yes" : "No") << endl;
}
return 0;
}