Leetcode PHP题解--D116 409. Longest Palindrome


D116 409. Longest Palindrome

题目链接

409. Longest Palindrome

题目分析

返回通过给定的字符串能组成的最长回文字符串长度。

思路

用array_count_values计算字母出现次数。再区分出现次数为偶数的字母和奇数次数的字母。用array_sum可以直接算出现了偶数次的字母。而对于出现了奇数次的字母,只能收录一个放在回文串的最中间。即需要从总和中减去n-1。其中n为出现次数为奇数的字母个数。

最终代码

<?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%的代码。后来改用了以下方案:

<?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%了。收工!

若觉得本文章对你有用,欢迎用爱发电资助。


点赞 取消点赞 收藏 取消收藏

<< 上一篇: 通过 pear 在命令行编译安装 swoole 扩展

>> 下一篇: Leetcode基础刷题之PHP解析(131. Palindrome Partitioning)