最长回文串
题目[leetcode409]
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。
注意:
假设字符串的长度不会超过 1010。
示例 1:
输入:
“abccccdd”
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
思路
按照回文串的对称结构,可以思考出,一种字符在出现时,两边都必须出现,或者在奇数时作为中间字符。
所以,最为主要的工作就是统计大小写字符所出现的有的个数,当个数为2的倍数时,最长回文串的长度+该字符的个数。当个数不为2的倍数时,最长回文串长度+该字符串长度-1,然后记录最长回文串的长度应为奇数(即flag=1)。
过程如下:
实现代码如下:
class Solution{
public:
int longestPalindrome(string s){
int char_map[128] = {0}; //字符哈希表
int max_length = 0; //回文串偶数部分
int flag = 0; //是否存在中心
for(int i = 0; i < s.length(); i++){
char_map[s[i]]++;
}
for(int i = 0; i < 128; i++){
if(char_map[i] % 2 == 0){
max_length += char_map[i];
}
else{
max_length += char_map[i] - 1;
flag = 1;
}
}
return max_length + flag;
}
}
致谢
本章知识点和思路由小象学院相关视频提供,由本人学习并梳理得出,希望自己加深记忆的同时,也能给大家提供更多有关于一些算法的知识点。
你的点赞、评论、收藏就是对我最大的支持与鼓励,谢谢!