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