哈希算法题目:最长回文串
字数 1114 2025-10-26 22:56:19
哈希算法题目:最长回文串
题目描述
给定一个包含大写字母和小写字母的字符串 s,返回可以通过这些字母构建的最长回文串的长度。需要注意的是,区分大小写,例如 "Aa" 在这里不视为相同的字符。
示例:
输入: s = "abccccdd"
输出: 7
解释: 最长回文串为 "dccaccd"(或 "dccbccd" 等),长度为 7。
解题过程
-
理解回文串的字符构成规律
- 回文串是正读反读都相同的字符串,其字符分布具有对称性。
- 若回文串长度为偶数,所有字符出现次数均为偶数。
- 若长度为奇数,除中心字符出现奇数次外,其余字符均出现偶数次。
- 因此,问题转化为:统计字符串中各字符的出现频次,利用偶数次字符,并最多允许一个奇数次字符作为中心。
-
统计字符频次
- 使用哈希表(如字典)记录每个字符的出现次数。
- 遍历字符串 s,对每个字符 c 执行
hashmap[c] += 1。 - 示例 s = "abccccdd" 的统计结果:
a:1, b:1, c:4, d:2
-
计算有效长度
- 遍历哈希表,对每个字符的频次 count:
- 若 count 为偶数,直接全部加入长度(
length += count)。 - 若 count 为奇数,则最多使用
count - 1个(偶数个)加入长度,并标记“存在奇数次字符”。
- 若 count 为偶数,直接全部加入长度(
- 最终若存在任何奇数次字符,可额外将其中一个作为中心,总长度
+1。
- 遍历哈希表,对每个字符的频次 count:
-
具体步骤分解
- 初始化长度
length = 0,标志位has_odd = False。 - 统计频次:a:1, b:1, c:4, d:2。
- 处理 a:count=1(奇数),加入长度 0(因
1-1=0),标记has_odd = True。 - 处理 b:count=1(奇数),加入长度 0,保持
has_odd = True。 - 处理 c:count=4(偶数),加入长度 4。
- 处理 d:count=2(偶数),加入长度 2。
- 当前总长度 = 0 + 0 + 4 + 2 = 6。
- 因存在奇数次字符(a 或 b),总长度可 +1,结果为 7。
- 初始化长度
-
算法优化
- 无需显式区分偶数和奇数:对每个 count,直接加入
count // 2 * 2(即向下取整到偶数)。 - 若最终长度小于原字符串长度(说明有剩余奇数字符),可额外 +1。
- 示例中:
a:1 → 贡献 0,b:1 → 贡献 0,c:4 → 贡献 4,d:2 → 贡献 2,总长 6 < 原长 8,故 +1 得 7。
- 无需显式区分偶数和奇数:对每个 count,直接加入
-
复杂度分析
- 时间复杂度 O(n):遍历字符串统计频次,遍历哈希表计算长度。
- 空间复杂度 O(1):字符集大小固定(如字母表最多 52 个字符)。