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; }
|