力扣 409. 最长回文串

题目说明

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。

注意:
假设字符串的长度不会超过 1010。

示例

示例 1:

1
2
3
4
5
6
7
8
输入:
"abccccdd"

输出:
7

解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

笔者理解

此题是一道字符串算法问题,在力扣题库中被定义为简单题。

解法

当笔者阅读完此题后,因为我们可以自由组合,所以我们只需要偶数次出现的字符和至多一个单个字符即可,让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
/*
* 字母数组
*/
public int longestPalindrome(String s) {
int result = 0;

int[] letters = new int [58];

char[] ch = s.toCharArray();

// 统计字母
for (char c : ch) {
letters[c - 'A']++;
}

// 取字符出现的偶次
for (int letter : letters) {
// 通过 (letter & 1) 来截断奇次
result += letter - (letter & 1);
}

// 如果总共的次数不等于字符长度, 就代表可以有一个奇字母放在回文子串中间
return result < ch.length? result + 1: result;
}
}

时间和空间效率还行,可见此解法还比较适合此题。

image-20210920120711577

总结

本题是今天的一题,难度是为简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。