【字符串】【打卡124天】:leetcode 409. 最长回文串

1、题目描述

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

在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。

注意:
假设字符串的长度不会超过 1010。

输入示例:

输入:
"abccccdd"

输出:
7

解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

2、算法分析

回文字符串,简单的说是对称的字符串,就是正着读和反着读都是一样的字符串。

要想获取最长的回文子串,需要有足够多的偶数对应的字符。比如

在字符串 "abba" 中,回文中心是 "ab|ba" 中竖线的位置,而在字符串 "abcba" 中,回文中心是 "ab(c)ba" 中的字符 "c" 本身。我们可以发现,在一个回文串中,只有最多一个字符出现了奇数次,其余的字符都出现偶数次。将每个字符使用偶数次,使得它们根据回文中心对称。在这之后,如果有剩余的字符,我们可以再取出一个,作为回文中心。

具体:

首先创建一个大小为128的数组,数组类型为int,因为字符串中存在大小写字母。

接着对这些大小写字母计数。

①获取偶数次的字符:cnt / 2 *2;不必担心cnt = 1的情况 1/2 = 0     0*2 = 0

②计数,遍历s字符串,然后计数

③遍历计数数组,然后计数偶数个字符。注意,当结果数为偶数的时候,且cnt=1的时候,也就是字符串中间的位置。计数加1

具体看代码。

3、代码实现

class Solution {
    public int longestPalindrome(String s) {
        //计数
        int[] count = new int[128];
        for(int i = 0;i < s.length();i++){
            char c = s.charAt(i);
            count[c]++;
        }
        int result = 0;
        for(int cnt : count){
            // 获取偶数的字符
            result += cnt / 2 * 2;
            // 中间值 +1
            if(cnt % 2 == 1 && result %2 == 0){
                result++;
            }
        }
        return result;
    }
}

Guess you like

Origin blog.csdn.net/Sunshineoe/article/details/121629197