給定一個包含大寫字母和小寫字母的字符串,找到通過這些字母構造成的最長的回文串。在構造過程中,請注意區分大小寫。比如"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++沒錯.
答案是對的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM