题目
- 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
- 在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
示例
①示例1
- 输入:“abccccdd”
- 输出:7
- 解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
说明
注意:假设字符串的长度不会超过 1010。
①相关话题
- 哈希表
②题目地址
解题方法
①哈希表
- 可用数组模拟的哈希表求解,速度最快(用空间换时间)。
- 先用哈希表记录每个字母的出现次数,然后注意回文串的中心可以是单个字母,但其余对称位置必须是相同的字母(即出现偶数次的字母)。
- 时间复杂度:O(N)。
- 空间复杂度:O(N)。
代码详解
- 哈希表
int longestPalindrome(char* s) {
int hash[52] = {0}, flag = 1, len = strlen(s), result = 0;
// 用哈希表记录每个字母的出现次数。
for (int i = 0; i < len; i++) {
if (s[i] >= 'a')
hash[s[i]-'a'+26]++;
else
hash[s[i]-'A']++;
}
for (int i = 0; i < 52; i++) {
if (hash[i] > 0) {
// 一个字母可以作为回文串的中心(1次)。
if (hash[i] % 2 != 0 && flag == 1) {
result++;
flag = 0;
}
// 除中心外的对称位置必须是相同的字母(即出现偶数次的字母)。
result += (hash[i]/2) * 2;
}
}
return result;
}
附录
- 我的个人博客:messi1002.top
- 如有错误或疑惑之处 请联系 wjymessi@163.com
- 所有题目解答:fork me on github