Leetcode PHP題解--D116 409. Longest Palindrome

D116 409. Longest Palindrome

題目連接

409. Longest Palindromephp

題目分析

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

相關文章
相關標籤/搜索