LeetCode 05 Longest Palindromic Substring

題目要求

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
??題目翻譯:給定一個字符串拭荤,找到最長的回文字串截碴,假定字符串長度最大為1000,并存在唯一的最大回文子串瞬沦。

題目分析一

假設(shè)s(j+1,k-1)是一個回文串添坊,且s[j]==s[k]区匠,可證,s(j,k)也一定是一個回文串帅腌。由此啟發(fā),我們可以記錄之前的結(jié)果作為啟發(fā)信息麻汰,以利于后面的判斷和搜索速客。該算法的復(fù)雜度為O(n^2)。

package com.linsiyue;

public class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();
        int lo = 0,maxLen = 0;
        // 聲明一個boolean型二維數(shù)值五鲫,s(j,k)為回文串則boolean[i][j]=true
        // 其中 i<=j
        boolean[][] dp = new boolean[n][n];
        for (int i = n-1; i >= 0; i--) {
            for (int j = i; j < n; j++) {
                // 關(guān)鍵點是j-i<3這個邊界條件的加入溺职,搜索問題要定義明確邊界條件
                // 當(dāng)字符串長度為1或i=0時,dp[i+1][j-1]會出現(xiàn)數(shù)組越界的錯誤
                // 當(dāng)s.charAt(i)==s.charAt(j) && j-i<3 時位喂,是回文串浪耘,如aba,aa
                dp[i][j] = s.charAt(i)==s.charAt(j) && (j-i<3 ||dp[i+1][j-1]);
                if (dp[i][j] && j-i+1>maxLen){
                    lo = i;
                    maxLen = j-i+1;
                }
            }
        }
        return s.substring(lo,lo+maxLen);
    }
}

題目分析二

長度為偶數(shù)的回文串,有如下性質(zhì):中間的兩個字符s[i]==s[i+1],且s[i-1]==s[i+2]塑崖,依次向兩邊對稱遞推七冲,直到碰到回文串邊界。長度為奇數(shù)的回文串规婆,最中間的數(shù)的兩邊的數(shù)相等澜躺,即s[i-1]==s[i+1],隱含著一個重要條件抒蚜,s[i]==s[i]掘鄙,有了該隱含條件,遞推模式即如偶數(shù)嗡髓。
??因此奇偶數(shù)情況可以抽象為一個模型:由中間向兩邊操漠,依次比較軸對稱的兩個字符,直到兩個字符不相等饿这,即可獲得該回文串的起始地址及長度浊伙。
??函數(shù)extendPalindrome(String s, int j, int k)即是該模型的實現(xiàn)。

package com.linsiyue;

public class Solution {
    private int lo, maxLen;
    public String longestPalindrome(String s) {
        int len = s.length();
        if (len<2)
            return s;
        for (int i = 0; i < len-1; i++) {
            // 奇數(shù)情況
            extendPalindrome(s,i,i);
            // 偶數(shù)情況
            extendPalindrome(s,i,i+1);
        }
        return s.substring(lo, lo+maxLen);
    }   
    public void extendPalindrome(String s, int j, int k) {
        while (j>=0 && k<s.length() && s.charAt(j)==s.charAt(k)){
            j--;
            k++;
        }
        // 跳出while循環(huán)時蛹稍,回文串的開頭和結(jié)尾游標(biāo)分別被-1和+1
        // 因此計算長度的補(bǔ)回:len=(k-1)-(j+1)+1=k-j-1
        if(maxLen < k-j-1){
            lo = j+1;
            maxLen = k-j-1;
        }
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吧黄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子唆姐,更是在濱河造成了極大的恐慌拗慨,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赵抢,居然都是意外死亡剧蹂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門烦却,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宠叼,“玉大人,你說我怎么就攤上這事其爵∶岸” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵摩渺,是天一觀的道長简烤。 經(jīng)常有香客問我,道長摇幻,這世上最難降的妖魔是什么横侦? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮绰姻,結(jié)果婚禮上枉侧,老公的妹妹穿的比我還像新娘。我一直安慰自己狂芋,他們只是感情好榨馁,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著银酗,像睡著了一般辆影。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黍特,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天蛙讥,我揣著相機(jī)與錄音,去河邊找鬼灭衷。 笑死次慢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翔曲。 我是一名探鬼主播迫像,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瞳遍!你這毒婦竟也來了闻妓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掠械,失蹤者是張志新(化名)和其女友劉穎由缆,沒想到半個月后注祖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡均唉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年是晨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舔箭。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡罩缴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出层扶,到底是詐尸還是另有隱情箫章,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布镜会,位于F島的核電站炉抒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稚叹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一拿诸、第九天 我趴在偏房一處隱蔽的房頂上張望扒袖。 院中可真熱鬧,春花似錦亩码、人聲如沸季率。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽飒泻。三九已至,卻和暖如春吏廉,著一層夾襖步出監(jiān)牢的瞬間泞遗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工席覆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留史辙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓佩伤,卻偏偏與公主長得像聊倔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子生巡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

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