leetcode.字符串.409最长回文串-Java

1. 具体题目

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。

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

示例 1:  输入: "abccccdd"  输出: 7

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

2. 思路分析

回文串是以中间为轴左右对称的,所以希望有一个中心元素,其余元素个数都为偶数。

首先想到统计字符串中各字符个数,判断奇偶性,保留一个中心元素之后,其余只要偶数元素。但是其实对于奇数元素,可以减去一个变为偶数元素,之后加进结果中。

3. 代码

 1 public int longestPalindrome(String s) {
 2         int[] l = new int[26];    //记录各小写字母个数
 3         int[] b = new int[26];  //记录各大写字母个数
 4         for(int i = 0; i < s.length(); i++){
 5             int diff = s.charAt(i) - 'A';
 6             if(diff < 26){
 7                 b[diff] += 1; 
 8             }else{
 9                 diff = s.charAt(i) - 'a';
10                 l[diff] += 1; 
11             }
12         }
13         int result = 0;
14         for(int num : l){
15             result += num / 2 * 2;   //保留所有偶数元素,并将奇数元素转为偶数
16             if(num % 2 != 0 && result % 2 == 0) result ++;  //保留一个中心元素
17         }
18         for(int num : b){
19             result += num / 2 * 2; 
20             if(num % 2 != 0 && result % 2 == 0) result ++;
21         }
22         return result;
23     }

猜你喜欢

转载自www.cnblogs.com/XRH2019/p/11843277.html