给定一个包含大写字母和小写字母的字符串 s
,返回 通过这些字母构造成的 最长的回文串 。
在构造过程中,请注意 区分大小写 。比如 "Aa"
不能当做一个回文字符串。
示例 1:
输入:s = "abccccdd" 输出:7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
示例 2:
输入:s = "a" 输入:1
示例 3:
输入:s = "bb" 输入: 2
提示:
1 <= s.length <= 2000
s
只能由小写和/或大写英文字母组成
一个回文字符串,最多存在一个出现奇数次数的字符,
先统计所有字符出现的次数,通用的方式是哈希表。题目已说明只存在大小写字母(52 种可能),也可以使用数组来存储。
而后,可分两种方式:
- 布尔变量
- 累加出现次数为偶数的数值。
- 对于奇数,第一次出现,完整累加;后续出现,则需要对次数
-1
去奇,再累加。
- 计数器
- 记录奇数出现的次数,最后的结果回文长度由
s.length - count
得知。 - 如果只存在一个奇数,那么可以直接返回
s.length
.
- 记录奇数出现的次数,最后的结果回文长度由
class Solution:
def longestPalindrome(self, s: str) -> int:
n = len(s)
counter = Counter(s)
odd_cnt = sum(e % 2 for e in counter.values())
return n if odd_cnt == 0 else n - odd_cnt + 1
class Solution {
public int longestPalindrome(String s) {
int[] counter = new int[128];
for (char c : s.toCharArray()) {
++counter[c];
}
int oddCnt = 0;
for (int e : counter) {
oddCnt += (e % 2);
}
int n = s.length();
return oddCnt == 0 ? n : n - oddCnt + 1;
}
}
function longestPalindrome(s: string): number {
let n = s.length;
let ans = 0;
let record = new Array(128).fill(0);
for (let i = 0; i < n; i++) {
record[s.charCodeAt(i)]++;
}
for (let i = 65; i < 128; i++) {
let count = record[i];
ans += count % 2 == 0 ? count : count - 1;
}
return ans < s.length ? ans + 1 : ans;
}
function longestPalindrome(s: string): number {
const map = new Map();
for (const c of s) {
map.set(c, (map.get(c) ?? 0) + 1);
}
let hasOdd = false;
let res = 0;
for (const v of map.values()) {
res += v;
if (v & 1) {
hasOdd = true;
res--;
}
}
return res + (hasOdd ? 1 : 0);
}
class Solution {
public:
int longestPalindrome(string s) {
vector<int> counter(128);
for (char c : s) ++counter[c];
int oddCnt = 0;
for (int e : counter) oddCnt += e % 2;
int n = s.size();
return oddCnt == 0 ? n : n - oddCnt + 1;
}
};
func longestPalindrome(s string) int {
counter := make([]int, 128)
for _, c := range s {
counter[c]++
}
oddCnt := 0
for _, e := range counter {
oddCnt += e % 2
}
n := len(s)
if oddCnt == 0 {
return n
}
return n - oddCnt + 1
}
use std::collections::HashMap;
impl Solution {
pub fn longest_palindrome(s: String) -> i32 {
let mut map: HashMap<char, i32> = HashMap::new();
for c in s.chars() {
map.insert(c, map.get(&c).unwrap_or(&0) + 1);
}
let mut has_odd = false;
let mut res = 0;
for v in map.values() {
res += v;
if v % 2 == 1 {
has_odd = true;
res -= 1;
}
}
res + if has_odd { 1 } else { 0 }
}
}