LeetCode筆記:409. Longest Palindrome

問(wèn)題:

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.

大意:

給出一個(gè)由小寫或大寫字母組成的字符串捻艳,找到能被其中的字母組成的最長(zhǎng)的回文的長(zhǎng)度。
這是區(qū)分大小寫的髓窜,比如“Aa”就不能認(rèn)為是回文捍岳。
注意:
假設(shè)給出的字符串長(zhǎng)度不會(huì)超過(guò)1010。
例子:

輸入:
“abccccdd”
輸出:
7
解釋:
最長(zhǎng)的回文為“dccaccd”哎壳,長(zhǎng)度為7。

思路:

這里回文的意思就是正著和反著都是一樣的字母順序。思路大家都是比較一致的攘滩,先看看字符串有哪些字母以及各自的數(shù)量,把成雙成對(duì)的數(shù)量的字母都挑出來(lái)纸泡,取其能成雙的最大數(shù)量漂问,這樣可以對(duì)稱地放在回文的兩邊,然后看有沒(méi)有落單的字母或者在成雙后還有剩余一個(gè)的字母,有就放在回文最中間蚤假,這樣就是最長(zhǎng)的回文了栏饮,數(shù)量也就出來(lái)了。這里是區(qū)分大小寫的磷仰,所以要分開(kāi)算袍嬉。不過(guò)題目中的1010這個(gè)最長(zhǎng)字符串長(zhǎng)度沒(méi)發(fā)現(xiàn)有什么特別的用處。

代碼(Java):

public class Solution {
    public int longestPalindrome(String s) {
        int[] letterNum = new int[26*2];
        char[] sArray = s.toCharArray();
        for (int i = 0; i < sArray.length; i++) {
             if ((sArray[i] - 'a') >= 0) {// 小寫字母
                 letterNum[(sArray[i] - 'a')]++;
             } else {// 大寫字母
                 letterNum[(sArray[i] - 'A' + 26)]++;
             }
        }
        
        int result = 0;
        boolean hasSingle = false;// 有無(wú)單個(gè)字符的標(biāo)記
        boolean hasOdd = false;// 有無(wú)2個(gè)以上奇數(shù)數(shù)量字符的標(biāo)記
        for (int i = 0; i < 26*2; i++) {
            if (letterNum[i] > 0 && letterNum[i] < 2) hasSingle = true;
            if (letterNum[i] > 1) {
                result += letterNum[i] / 2 * 2;
                if (letterNum[i] % 2 == 1) hasOdd = true;
            }
        }
        result += hasSingle || hasOdd ? 1 : 0;
        return result;
    }
}

他山之石:

public int longestPalindrome(String s) {
        boolean[] map = new boolean[128];
        int len = 0;
        for (char c : s.toCharArray()) {
            map[c] = !map[c];         // flip on each occurrence, false when seen n*2 times
            if (!map[c]) len+=2;
        }
        if (len < s.length()) len++; // if more than len, atleast one single is present
        return len;
    }

這個(gè)做法其實(shí)思路是一樣的灶平,只是更加精簡(jiǎn)巧妙伺通,boolan數(shù)組初始化時(shí)都是false,128的長(zhǎng)度是為了包含所有ASCII碼逢享,懶得特意去判斷大小寫了罐监,每次遇到一個(gè)字母就將其對(duì)應(yīng)的位置取反,如果出現(xiàn)兩次就會(huì)又變回false瞒爬,那么每出現(xiàn)兩次就可以將回文長(zhǎng)度加2弓柱。最后看加起來(lái)的長(zhǎng)度和原字符串長(zhǎng)度是否相同,不同則說(shuō)明有單個(gè)字符剩余疮鲫,就可以放在回文正中間吆你,跟我的做法比,思路差不多俊犯,代碼卻巧妙多了妇多,厲害呀。

合集:https://github.com/Cloudox/LeetCode-Record


查看作者首頁(yè)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末燕侠,一起剝皮案震驚了整個(gè)濱河市者祖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绢彤,老刑警劉巖七问,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異茫舶,居然都是意外死亡械巡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門饶氏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)讥耗,“玉大人,你說(shuō)我怎么就攤上這事疹启」懦蹋” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵喊崖,是天一觀的道長(zhǎng)挣磨。 經(jīng)常有香客問(wèn)我雇逞,道長(zhǎng),這世上最難降的妖魔是什么茁裙? 我笑而不...
    開(kāi)封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任塘砸,我火速辦了婚禮,結(jié)果婚禮上呜达,老公的妹妹穿的比我還像新娘谣蠢。我一直安慰自己,他們只是感情好查近,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布眉踱。 她就那樣靜靜地躺著,像睡著了一般霜威。 火紅的嫁衣襯著肌膚如雪谈喳。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天戈泼,我揣著相機(jī)與錄音婿禽,去河邊找鬼。 笑死大猛,一個(gè)胖子當(dāng)著我的面吹牛扭倾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挽绩,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼膛壹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了唉堪?” 一聲冷哼從身側(cè)響起模聋,我...
    開(kāi)封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唠亚,沒(méi)想到半個(gè)月后链方,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灶搜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年祟蚀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片割卖。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡前酿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出究珊,到底是詐尸還是另有隱情薪者,我是刑警寧澤纵苛,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布剿涮,位于F島的核電站言津,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏取试。R本人自食惡果不足惜悬槽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瞬浓。 院中可真熱鬧初婆,春花似錦、人聲如沸猿棉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)萨赁。三九已至弊琴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杖爽,已是汗流浹背敲董。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慰安,地道東北人腋寨。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像化焕,于是被迫代替她去往敵國(guó)和親萄窜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容