目录
一、前言
最长回文串 这道题,可以说是--回文专题 和 哈希专题--,最经典的一道题,也是在面试中频率最高的一道题目,通常在面试中,面试官可能会从多个方面考察这道题目,所以大家需要对这道题目非常熟悉哦!!
本片博客就来详细的讲讲解一下 最长回文串 的实现方法,让我们的面试变的更加顺利!!!
二、题目描述

三、预备知识
🥝 什么回文串 ?
回文串 的概念就是正着读和倒着读是一样的字符串,分为以下两种情况
① 11211 ---- 奇数个② 112211---- 偶数个
不难发现,除了中间的字符外,所有的字符均在一首一尾出现了一次,也就是说,出现在两边的字符数量一定是偶数,只有出现在中间的字符数量可以是奇数
- 现在,我们把上述①、②回文串拆分成
left,mid,right三个部分,如下图

- 「回文串」长度为偶数:所有不同字符的出现次数都为「偶数」;
- 「回文串」长度为奇数:位于中点的字符出现「奇数」次,其余字符出现「偶数」次;

四、题目解析
根据以上分析,字符串能被构造成回文串的充要条件为:除了一种字符出现奇数次外,其余所有字符出现偶数次。判别流程如下:
1. 借助一个 HashMap ,统计字符串 s 中各字符的出现次数;
2. 遍历 HashMap ,统计构造回文串的最大长度,
- 将当前字符的出现次数向下取偶数(即若为偶数则不变,若为奇数则减 1 ),出现偶数次则都可组成回文串,因此计入 res ;
- 若此字符出现次数为奇数,则可将此字符放到回文串中心,因此将 odd 置 1 ;
3. 返回 res + odd 即可。






class Solution {
public:
int longestPalindrome(string s)
{
// 统计各字符个数
unordered_map<char,int> counter; // key->char value->int
for(auto ch : s)
{
counter[ch]++;
}
// 统计构造回文串的最大长度
int res = 0 ,odd = 0;
for(auto kv : counter)
{
// 将当前 字符出现次数向下取偶数,并计入 res
int count = kv.second;
int rem = count%2; // 求余数
res+=count-rem;
// 若当前字符出现次数为奇数,则将odd 置 为 1
if(rem == 1)
odd = 1;
}
return res+odd;
}
};

五、总结与提炼
最后我们来总结一下本文所介绍的内容,本文讲解来一道力扣中有关 最长回文串 的题目,这道题目是校招笔试面试中有关 回文 和 哈希 章节非常高频的一道题目,大家下去一定要自己再画画图,分析一下,把这段代码逻辑自己实现一遍,才能更好地掌握 !!
六、共勉
以下就是我对 最长回文串 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 回文专题 和 哈希专题 的理解,请持续关注我哦!!!


795

被折叠的 条评论
为什么被折叠?



