1. 程式人生 > >LeetCode——409. Longest Palindrome

LeetCode——409. Longest Palindrome

long 回文 charat ole ive ring which 不能 判斷

題目:

  Given a string which consists of lowercase or uppercase letters, find the length of the longest palindromes that can be built with those letters.

  This is case sensitive, for example "Aa" is not considered a palindrome here.

  Note:
  Assume the length of given string will not exceed 1,010.

  Example:

Input:
"abccccdd"

Output:
7

Explanation:
One longest palindrome that can be built is "dccaccd", whose length is 7.

大意:

  給出一個由小寫或大寫字母組成的字符串,找到能被其中的字母組成的最長的回文的長度。

  這是區分大小寫的,比如“Aa”就不能認為是回文。

  註意:
  假設給出的字符串長度不會超過1010。

  例子:

輸入: 
“abccccdd”

輸出: 
7

解釋: 
最長的回文為“dccaccd”,長度為7。

  回文就是中間有一個單個的字母,兩邊的字母是對稱的。

  • aaadd的最長回文是daaad
  • aaadddcc的最長回文是cdaaadc或者cadddac

  可以總結為:

  • 數目為偶數的字母將全部出現在最長回文中,
  • 奇數就有兩種情況,有沒有大於1個的,如果有大於1個的。就比如有3個,那麽回文長度將加上2。如果有7個就加上6.
  • 如果所有的奇數都不大於1,最後結果再加1即可
class Solution {
    public int longestPalindrome(String s) {
        int result = 0;
        boolean flag = false;
        int[] a = new int
[26*2]; for (int i = 0; i < s.length(); i++) { if (s.charAt(i) < ‘a‘) { a[s.charAt(i) - ‘A‘ + 26]++; } else { a[s.charAt(i) - ‘a‘] ++; } } for(int i:a){ if(i == 1){ flag = true; } if(i > 1){ result += i / 2 * 2; if (i % 2 == 1) flag = true; } } if(flag){ result++; } return result; }
}

  這裏使用一個26*2的數組記錄字幕個數,因為是區分大小寫的,每次如果字母數目大於1先除2再乘2,這樣偶數不變,奇數將減一。還設置了一個flag變量判斷是否存在奇數。

LeetCode——409. Longest Palindrome