comments | difficulty | edit_url | tags | |||
---|---|---|---|---|---|---|
true |
简单 |
|
给定一个包含大写字母和小写字母的字符串 s
,返回 通过这些字母构造成的 最长的回文串 。
在构造过程中,请注意 区分大小写 。比如 "Aa"
不能当做一个回文字符串。
示例 1:
输入:s = "abccccdd" 输出:7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
示例 2:
输入:s = "a" 输出:1
示例 3:
输入:s = "aaaaaccc" 输出:7
提示:
1 <= s.length <= 2000
s
只由小写 和/或 大写英文字母组成
一个合法的回文字符串,最多存在一个出现奇数次数的字符,其余字符出现次数均为偶数。
因此,我们可以先遍历字符串
然后,我们遍历
最后,我们返回
时间复杂度
class Solution:
def longestPalindrome(self, s: str) -> int:
cnt = Counter(s)
ans = 0
for v in cnt.values():
ans += v - (v & 1)
ans += (ans & 1 ^ 1) and (v & 1)
return ans
class Solution {
public int longestPalindrome(String s) {
int[] cnt = new int[128];
for (int i = 0; i < s.length(); ++i) {
++cnt[s.charAt(i)];
}
int ans = 0;
for (int v : cnt) {
ans += v - (v & 1);
if (ans % 2 == 0 && v % 2 == 1) {
++ans;
}
}
return ans;
}
}
class Solution {
public:
int longestPalindrome(string s) {
int cnt[128]{};
for (char& c : s) {
++cnt[c];
}
int ans = 0;
for (int v : cnt) {
ans += v - (v & 1);
if (ans % 2 == 0 && v % 2 == 1) {
++ans;
}
}
return ans;
}
};
func longestPalindrome(s string) (ans int) {
cnt := [128]int{}
for _, c := range s {
cnt[c]++
}
for _, v := range cnt {
ans += v - (v & 1)
if ans&1 == 0 && v&1 == 1 {
ans++
}
}
return
}
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;
}
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 })
}
}
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);
}