题意:
给定一个包含大写字母和小写字母的字符串 s
,返回 通过这些字母构造成的 最长的回文串 。
在构造过程中,请注意 区分大小写 。比如 “Aa
” 不能当做一个回文字符串。
示例 1:
输入😒 = “abccccdd”
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
示例 2:
输入😒 = “a”
输出:1
示例 3:
输入😒 = “aaaaaccc”
输出:7
提示:
1 <= s.length <= 2000
s
只由小写 和/或 大写英文字母组成
题目来源: https://leetcode.cn/problems/longest-palindrome/description/
解题方法:
思路:将字符串拆分为数组,统计各个字符出现的次数,再通过出现次数的奇偶数判断(偶数直接累加,奇数自身减一再累加,只要存在奇数,最后要对长度加一),对回文串的长度进行计算
function longestPalindrome($s) {
if(strlen($s) == 1){
return 1;
}
$s_arr = str_split($s); //拆分为数组
$count = array_count_values($s_arr); // 统计各个字符出现的次数
if(count($count) == 1){
return strlen($s);
}
$num = 0;
$odd_number = []; //数量为奇数的元素
foreach($count as $key => $value){
if($value % 2 == 0){ //偶数直接累加
$num += $value;
}else{
$odd_number[$key] = $value;
$num += ($value - 1); //奇数要本身减一再累加
}
}
if(count($odd_number) != 0){ //如果存在奇数元素,结果要加一
$num++;
}
return $num;
}