返回經過給定的字符串能組成的最長迴文字符串長度。.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