返回经过给定的字符串能组成的最长回文字符串长度。.net
用array_count_values计算字母出现次数。再区分出现次数为偶数的字母和奇数次数的字母。用array_sum能够直接算出现了偶数次的字母。而对于出现了奇数次的字母,只能收录一个放在回文串的最中间。即须要从总和中减去n-1。其中n为出现次数为奇数的字母个数。code
<?php class Solution { /** * @param String $s * @return Integer */ function longestPalindrome($s) { $s = str_split($s); $amounts = array_count_values($s); $total = 0; $maxOdd = 0; foreach($amounts as $v){ $total += $v; if($v%2 != 0){ $total -=1; if($v > $maxOdd){ $maxOdd = $v; } } } if($maxOdd!= 0){ $total+=1; } return $total; } }
这个方案只战胜了15.8%的代码。后来改用了如下方案:leetcode
<?php class Solution { /** * @param String $s * @return Integer */ function longestPalindrome($s) { $s = str_split($s); $amounts = array_count_values($s); $odd = []; $even = []; array_walk($amounts, function($v, $k) use (&$odd, &$even){ if($v%2 != 0){ $odd[$k] = $v; } else{ $even[$k] = $v; } }); $odds = count($odd); if(!empty($odds)){ $odds--; } $total = array_sum($even) + array_sum($odd) - $odds; return $total; } }
就战胜了100%了。收工!字符串
若以为本文章对你有用,欢迎用爱发电资助。get