刷题记录 leetcode409:最长回文串

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

示例

输入:
"abccccdd"

输出:
7

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

 

思路:如果字母出现的次数是偶数,可以直接用,如果是奇数,注意有两种情况,这个奇数如果大于1,可以减1变成偶数拿来用,但是如果只有一个字母是奇数或者这个奇数等于1,它可以被放在中间而不用减1。考虑到这种情况,可以把所有奇数都减1处理,如果最后的结果小于字符串长度,说明有个奇数应该被放在中间,再给结果加1

public int longestPalindrome(String s) {
    int[] cnts = new int[256];
    for (char c : s.toCharArray()) {
        cnts[c]++;
    }
    int palindrome = 0;
    for (int cnt : cnts) {
        palindrome += (cnt / 2) * 2;  // 偶数不变,奇数减1变成偶数
    }
    if (palindrome < s.length()) {
        palindrome++;   // 这个条件下 s 中一定有单个未使用的字符存在,可以把这个字符放到回文的最中间
    }
    return palindrome;
}

 

posted @ 2020-07-23 16:07  嫩西瓜  阅读(151)  评论(0)    收藏  举报