LeetCode 最長(zhǎng)回文子串

給定一個(gè)字符串 s亡鼠,找到 s 中最長(zhǎng)的回文子串乾蓬。你可以假設(shè) s 的最大長(zhǎng)度為1000。

示例 1:

輸入: "babad"
輸出: "bab"
注意: "aba"也是一個(gè)有效答案反浓。
示例 2:

輸入: "cbbd"
輸出: "bb"
解法一:

用動(dòng)態(tài)規(guī)劃來(lái)解,我們維護(hù)一個(gè)二維數(shù)組 dp[][]赞哗,其中 dp[i][j] 表示字符串區(qū)間 [i, j] 是否為回文串雷则,當(dāng) i = j 時(shí),只有一個(gè)字符肪笋,肯定是回文串月劈,如果 j = i + 1度迂,說(shuō)明是相鄰字符,此時(shí)需要判斷 s[i] 是否等于s [j]猜揪,如果 i 和 j 不相鄰惭墓,即 j - i >= 2 時(shí),除了判斷 s[i] 和 s[j] 相等之外而姐,還要判斷 dp[i + 1][j - 1] 是否為真诅妹,如果是,則為回文串毅人,通過(guò)以上分析,可以寫(xiě)出遞推式如下:

dp[i, j] = 1                                   if i == j

         = s[i] == s[j]                        if j = i + 1

         = s[i] == s[j] && dp[i + 1][j - 1]    if j > i + 1      
    public String longestPalindrome(String s) {

        if (s.length() == 0) {
            return s;
        }
        
        int[][] dp = new int[s.length()][s.length()];

        int left = 0, right = 0, len = 0;

        for (int j = 0; j < s.length(); j++) {
            for (int i = 0; i < j; i++) {
                if (s.charAt(i) == s.charAt(j) && (j - i < 2 || dp[i + 1][j - 1] == 1)) {
                    dp[i][j] = 1;
                } else {
                    dp[i][j] = 0;
                }

                if (dp[i][j] == 1 && len < j - i + 1) {
                    len = j - i + 1;
                    left = i;
                    right = j;
                }
            }
            dp[j][j] = 1;
        }
        return s.substring(left, right + 1);
    }

注意尖殃,如果字符串為空字符串 “”丈莺,則應(yīng)該單獨(dú)處理,因?yàn)?subString 方法中如果結(jié)束索引大于字符串的長(zhǎng)度會(huì)報(bào)異常送丰。所以不能統(tǒng)一返回 s.substring(left, right + 1)缔俄。

    public String substring(int beginIndex, int endIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > value.length) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        int subLen = endIndex - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return ((beginIndex == 0) && (endIndex == value.length)) ? this
                : new String(value, beginIndex, subLen);
    }
解法二:

Manacher's Algorithm 馬拉車算法

    public String longestPalindrome(String s) {
        StringBuilder stringBuilder = new StringBuilder("$#");

        for (int i = 0; i < s.length(); i++) {
            stringBuilder.append(s.charAt(i));
            stringBuilder.append('#');
        }

        String t = stringBuilder.toString();

        int[] p = new int[t.length()];

        int id = 0, mx = 0, resLen = 0, resCenter = 0;

        for (int i = 1; i < t.length(); i++) {
            p[i] = mx > i ? Math.min(p[2 * id - i], mx - i) : 1;
            while ((i + p[i] < t.length()) && (i - p[i] >= 0) && (t.charAt(i + p[i]) == t.charAt(i - p[i]))) {
                p[i]++;
            }
            if (mx < i + p[i]) {
                mx = i + p[i];
                id = i;
            }

            if (resLen < p[i]) {
                resLen = p[i];
                resCenter = i;
            }
        }
        return s.substring((resCenter - resLen) / 2,
                (resCenter - resLen) / 2 + resLen - 1);
    }

本文參考自 [LeetCode] Longest Palindromic Substring 最長(zhǎng)回文串

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市器躏,隨后出現(xiàn)的幾起案子俐载,更是在濱河造成了極大的恐慌,老刑警劉巖登失,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遏佣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡揽浙,警方通過(guò)查閱死者的電腦和手機(jī)状婶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)馅巷,“玉大人膛虫,你說(shuō)我怎么就攤上這事〉鲡” “怎么了稍刀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)敞曹。 經(jīng)常有香客問(wèn)我账月,道長(zhǎng),這世上最難降的妖魔是什么异雁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任捶障,我火速辦了婚禮,結(jié)果婚禮上纲刀,老公的妹妹穿的比我還像新娘项炼。我一直安慰自己担平,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布锭部。 她就那樣靜靜地躺著暂论,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拌禾。 梳的紋絲不亂的頭發(fā)上取胎,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音湃窍,去河邊找鬼闻蛀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛您市,可吹牛的內(nèi)容都是我干的觉痛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼茵休,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼薪棒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起榕莺,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤俐芯,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后钉鸯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吧史,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年唠雕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扣蜻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡及塘,死狀恐怖莽使,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笙僚,我是刑警寧澤芳肌,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站肋层,受9級(jí)特大地震影響亿笤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜栋猖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一净薛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒲拉,春花似錦肃拜、人聲如沸痴腌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)士聪。三九已至,卻和暖如春猛蔽,著一層夾襖步出監(jiān)牢的瞬間剥悟,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工曼库, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留区岗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓毁枯,卻偏偏與公主長(zhǎng)得像躏尉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子后众,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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