給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。在構造過程中,請注意區分大小寫。比如"Aa"不能當做一個迴文字串。注 意:假設字串的長度不會超過 1010。
阿新 • • 發佈:2020-08-14
給定一個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的迴文串。在構造過程中,請注意區分大小寫。比如"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++沒錯.
答案是對的