2131. 连接两字母单词得到的最长回文串
题目描述:给定一个由双字母字符串组成的数组,求用这些单词能组成的最长回文串长度。我们需要通过分类讨论来解决这个问题。
对于xx型单词:
- 奇数数量(如3个"aa"):可以左右各放一个,中间放一个
- 偶数数量(如4个"aa"):可以左右各放两个
对于xy型单词:
- 奇数数量(如3个"xy"和2个"yx"):可以左右各放两个,舍弃多余的
- 偶数数量(如2个"xy"和2个"yx"):可以左右各放两个
总结规律:
-
xx型单词:
- 出现次数为偶数时:直接累加次数
- 出现次数为奇数时:累加次数减1 可统一表示为:累加(总次数 - 次数%2)
-
xy型单词: 累加 xy 和 yx 中出现次数较少者的两倍
最后还需考虑是否存在奇数个xx型单词,因为可以将其放在回文串中心。
class Solution {
public:int longestPalindrome(vector<string>& words) {vector<vector<int>> cnt(26,vector<int>(26,0));for (auto w : words) {cnt[w[0] - 'a'][w[1] - 'a'] += 1;}int add = 0, odd = 0;for (int i = 0;i < 26;i++) {int c = cnt[i][i];add += c - c % 2;odd |= c % 2;for (int j = i + 1;j < 26;j++) {add += min(cnt[i][j],cnt[j][i]) * 2;}}return (add + odd) * 2;}
};
时间复杂度:O(n)
空间复杂度:O(26^2)