构造最长的回文串

题目描述

给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的最长的回文串 。

示例

输入:s = "abccccdd"
输出:7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

分析

  1. 统计每个字符出现的次数
  2. 出现偶数次的字符,肯定能够组成回文串
  3. 出现奇数次的字符,奇数次减1变成偶数次,也即:减掉一个字符后,肯定能够组成回文串
  4. 可以将第一次出现奇数次的那个字符,选为回文串的中间字符,也能组成回文串。但是中间位置只有一个,因此只能加1次。比如 aabc,最长回文子串是:aba,中间字符只有一个,即为字符 'b'

代码

    public int longestPalindrome2(String s) {
        int[] arr = new int[128];
        for (int i = 0; i < s.length(); i++) {
            //字符的范围是 0-127
            char c = s.charAt(i);
            //统计每个字符出现的次数
            arr[c]++;
        }

        int totalLen = 0;
        //标识字符串 s 中 第一次出现奇数次 的那个字符, 可以将此字符放到回文串最中间
        boolean firstOddNumber = true;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % 2 == 0) {
                //出现次数为偶数的字符,肯定可以组成回文串
                totalLen += arr[i];
            } else  {
                //出现次数为为奇数,奇数的次数-1 肯定可以组成回文串
                totalLen += arr[i] - 1;
                if (firstOddNumber) {
                    //选择第一次的奇数,可以放到回文的最中间,因此回文的长度加1
                    totalLen++;
                    //最中间位置只会有一个字符,因此放完之后,其它字符都不能放了,故 firstOddNumber 设置为 false
                    firstOddNumber = false;
                }
            }
        }
        return totalLen;
    }

leetcode 原文:https://leetcode.cn/problems/longest-palindrome/submissions/

posted @ 2023-02-28 23:54  大熊猫同学  阅读(31)  评论(0编辑  收藏  举报