0409. 最长回文串【简单】
1. 📝 题目描述
给定一个包含大写字母和小写字母的字符串 s,返回 通过这些字母构造成的 最长的 回文串 的长度。
回文串是向前和向后读都相同的字符串。
在构造过程中,请注意 区分大小写。比如 "Aa" 不能当做一个回文字符串。
示例 1:
txt
输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。1
2
3
4
2
3
4
示例 2:
txt
输入:s = "a"
输出:1
解释:可以构造的最长回文串是"a",它的长度是 1。1
2
3
2
3
提示:
1 <= s.length <= 2000s只由小写 和/或 大写英文字母组成
2. 🎯 s.1 - 暴力解法 - 统计字符出现次数
js
/**
* @param {string} s
* @return {number}
*/
var longestPalindrome = function (s) {
// 统计每个字符出现的次数
const charCount = {}
for (let char of s) {
charCount[char] = (charCount[char] || 0) + 1
}
let length = 0
let hasOdd = false
// 计算回文串的最大长度
for (let count of Object.values(charCount)) {
if (count % 2 === 0) {
// 偶数次字符全部使用
length += count
} else {
// 奇数次字符使用 count - 1 个
length += count - 1
hasOdd = true
}
}
// 如果有奇数次字符,可以在中心放一个,且只能放一个
if (hasOdd) {
length += 1
}
return length
}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
27
28
29
30
31
32
33
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
27
28
29
30
31
32
33
js
/**
* @param {string} s
* @return {number}
*/
var longestPalindrome = function (s) {
const freq = {}
for (let char of s) {
freq[char] = (freq[char] || 0) + 1
}
let length = 0
for (let count of Object.values(freq)) {
length += count - (count % 2) // 加入最大偶数部分
}
// 如果还能加一个中心字符(说明有奇数频次字符被截断了)
return length < s.length ? length + 1 : length
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 时间复杂度:
,其中 n 是字符串的长度,需要遍历字符串一次统计字符,再遍历一次统计结果 - 空间复杂度:
,其中 k 是字符串中不同字符的个数,用于存储字符计数