最长回文串


最长回文串

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串的长度
在构造过程中,请注意 区分大小写 比如 "Aa" 不能当做一个回文字符串
回文串指字符串正读反读值相同

示例 1:
输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

示例 2:
输入:s = "a"
输出:1
解释:可以构造的最长回文串是"a",它的长度是 1。

解法

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
思路:
回文串左右对称,证明只有一个字符的数量可以为奇数,其他字符的数量只能为偶数
奇数字符串-1成为偶数,所以只需要减去奇数字符串的个数,如果存在奇数,结果+1,作为中间的字符

代码1:
/**
* @param String $s
*
* @return Integer
*/
function longestPalindrome($s)
{
// 每个字符的数量
$list = count_chars($s);

$n = 0;
$h = false;
foreach ($list as $num) {
if ($num % 2 === 0) {
// 偶数数量直接相加
$n += $num;
} else {
// 奇数数量-1相加
$n += $num - 1;

$h = true;
}
}

// 如果存在奇数,结果+1
return $n + ($h ? 1 : 0);
}

代码2:
/**
* @param String $s
*
* @return Integer
*/
function longestPalindrome($s)
{
$map = [];
for ($i = 0; $i < strlen($s); $i++) {
if (!isset($map[$s[$i]])) {
$map[$s[$i]] = 0;
}
// 计算每个字符的数量
$map[$s[$i]]++;
}

$count = 0;
foreach ($map as $num) {
if ($num % 2) {
// 计算奇数字符串的数量
$count++;
}
}

// 不存在奇数字符串,直接返回整个字符串的长度,存在奇数字符串,减去奇数字符串的个数后+1,作为奇数的中间数
return $count === 0 ? strlen($s) : strlen($s) - $count + 1;
}