1. 程式人生 > 實用技巧 >給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。在構造過程中,請注意區分大小寫。比如"Aa"不能當做一個迴文字串。注 意:假設字串的長度不會超過 1010。

給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。在構造過程中,請注意區分大小寫。比如"Aa"不能當做一個迴文字串。注 意:假設字串的長度不會超過 1010。

給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。在構造過程中,請注意區分大小寫。比如"Aa"不能當做一個迴文字串。注 意:假設字串的長度不會超過 1010。

迴文串:“迴文串”是一個正讀和反讀都一樣的字串,比如“level”或者“noon”等等就是迴文串。——百度百科 地址:
https://baike.baidu.com/item/迴文串/1274921?fr=aladdin

輸入:
"abccccdd"

輸出:
7

解釋:
我們可以構造的最長的迴文串是"dccaccd", 它的長度是 7。

我們上面已經知道了什麼是迴文串?現在我們考慮一下可以構成迴文串的兩種情況:

字元出現次數為雙數的組合
字元出現次數為偶數的組合+單個字元中出現次數最多且為奇數次的字元 (參見 issue665 )
統計字元出現的次數即可,雙數才能構成迴文。因為允許中間一個數單獨出現,比如“abcba”,所以如果最後有字母落單,總長度可以加 1。首先將字串轉變為字元陣列。然後遍歷該陣列,判斷對應字元是否在hashset中,如果不在就加進去,如果在就讓count++,然後移除該字元!這樣就能找到出現次數為雙數的字元個數。

感覺這個解是認定這傳入的字串除了length 0以外都會構成迴文串

class Solution {
  public int longestPalindrome(String s) {
    if (s.length() == 0)
      return 0;
    // 用於存放字元
    HashSet<Character> hashset = new HashSet<Character>();
    char[] chars = s.toCharArray();
    int count = 0;
    for (int i = 0; i < chars.length; i++) {
      if (!hashset.contains(chars[i])) {// 如果hashset沒有該字元就儲存進去
        hashset.add(chars[i]);
      } else {// 如果有,就讓count++(說明找到了一個成對的字元),然後把該字元移除
        hashset.remove(chars[i]);
        count++;
      }
    }
    return hashset.isEmpty() ? count * 2 : count * 2 + 1;
  }
}

如果像abcabcef就判定錯了
應該把return改下

return hashset.isEmpty() ? count*2 : hashset.size()==1 ? count*2+1 : //兩個不同的

嗯也對,因為只有重複時才count++沒錯.
答案是對的