Dynamic Programming 1:Longest Valid Parentheses

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

Example 1:

Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"

Example 2:

Input: ")()())"
Output: 4
Explanation: The longest valid parentheses substring is "()()"

簡(jiǎn)單說(shuō)一下題意:
給定一個(gè)只包含"("或")"的字符串液肌,找到括號(hào)格式正確的最長(zhǎng)子字符串的長(zhǎng)度蘸劈,比如輸入為"(()"時(shí)胧后,輸出為2,輸入為")()())"輸出為4科盛。

此問(wèn)題肯定需要遍歷所有字符帽衙,遍歷到一個(gè)")"時(shí)盡量利用前面獲取到的信息進(jìn)行配對(duì),如果前面有能夠匹配的到的"("贞绵,這里“能夠匹配的到的”的意思是離其最近的沒(méi)有配對(duì)的"("厉萝,那么根據(jù)前面的信息計(jì)算出當(dāng)前位置最長(zhǎng)有效子字符串的長(zhǎng)度。計(jì)算的方法是:

我們使用n表示索引(0開(kāi)始),f(n)表示n位置字符參與的能夠配對(duì)的子字符串長(zhǎng)度冀泻,那么上一個(gè)沒(méi)有配對(duì)的'('的位置為n - f(n-1) -2:


IMG_20180621_171404.jpg

根據(jù)推導(dǎo)公式實(shí)現(xiàn)的代碼:

public class LongestValidParentheses {
    public static void main(String[] args) {
        System.out.println(new LongestValidParentheses()
                                   .longestValidParentheses2("()(())"));
    }

    int longestValidParentheses2(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }
        int[] lengthArr = new int[s.length()];

        int max = 0;
        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(i) == ')' && i - lengthArr[i - 1] - 1 >= 0 && s
                    .charAt(i - lengthArr[i - 1] - 1) == '(') {
                lengthArr[i] = lengthArr[i - 1] + 2 + (i - lengthArr[i - 1] -
                        2 > 0 ? lengthArr[i - lengthArr[i - 1] - 2] : 0);
            }
            max = Math.max(max, lengthArr[i]);
        }

        return max;
    }
}

看到有的解決方案是創(chuàng)建一個(gè)s.length()+1的數(shù)組,0位置為保留位置蜡饵,這樣就不用判斷“i - lengthArr[i - 1] - 2 > 0”了弹渔。

現(xiàn)在貼上代碼:

public int longestValidParentheses(String s) {
    int n = s.length();
    int max = 0;
    int[] dp = new int[n+1];
    for(int i = 1; i <= n; i++){
        if(s.charAt(i-1) == ')' && i-dp[i-1]-2 >= 0 && s.charAt(i-dp[i-1]-2) == '('){
            dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2];
            max = Math.max(dp[i], max);
        }
    }
    return max;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市溯祸,隨后出現(xiàn)的幾起案子肢专,更是在濱河造成了極大的恐慌,老刑警劉巖焦辅,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件博杖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡筷登,警方通過(guò)查閱死者的電腦和手機(jī)剃根,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)前方,“玉大人狈醉,你說(shuō)我怎么就攤上這事』菹眨” “怎么了苗傅?”我有些...
    開(kāi)封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)班巩。 經(jīng)常有香客問(wèn)我渣慕,道長(zhǎng),這世上最難降的妖魔是什么抱慌? 我笑而不...
    開(kāi)封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任逊桦,我火速辦了婚禮,結(jié)果婚禮上遥缕,老公的妹妹穿的比我還像新娘卫袒。我一直安慰自己,他們只是感情好单匣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布夕凝。 她就那樣靜靜地躺著,像睡著了一般户秤。 火紅的嫁衣襯著肌膚如雪码秉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天鸡号,我揣著相機(jī)與錄音转砖,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛府蔗,可吹牛的內(nèi)容都是我干的晋控。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼姓赤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赡译!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起不铆,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝌焚,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后誓斥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體只洒,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年劳坑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毕谴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡距芬,死狀恐怖析珊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蔑穴,我是刑警寧澤忠寻,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站存和,受9級(jí)特大地震影響奕剃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捐腿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一纵朋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茄袖,春花似錦操软、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蝗羊,卻和暖如春藏澳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耀找。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工翔悠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓蓄愁,卻偏偏與公主長(zhǎng)得像双炕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撮抓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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

  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,813評(píng)論 0 38
  • 前言 最先接觸編程的知識(shí)是在大學(xué)里面胀滚,大學(xué)里面學(xué)了一些基礎(chǔ)的知識(shí),c語(yǔ)言乱投,java語(yǔ)言咽笼,單片機(jī)的匯編語(yǔ)言等;大學(xué)畢...
    oceanfive閱讀 3,088評(píng)論 0 7
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理戚炫,服務(wù)發(fā)現(xiàn)剑刑,斷路器,智...
    卡卡羅2017閱讀 134,672評(píng)論 18 139
  • 朋友來(lái)信問(wèn)我在加拿大過(guò)得怎么樣双肤,我回信說(shuō)大部分時(shí)間在家?guī)Ш⒆印揖挂伯?dāng)了全職太太施掏,這可是以前沒(méi)想到過(guò)的。年少時(shí)總...
    一根筋的列那狐閱讀 512評(píng)論 7 15
  • 動(dòng)動(dòng)開(kāi)始用電腦了茅糜,屏幕比手機(jī)大多了七芭,這樣,動(dòng)兒的眼睛和脊柱就沒(méi)那么辛苦了蔑赘。感賞動(dòng)兒懂得愛(ài)惜自己了狸驳! 昨天,媽媽想充...
    小可以之動(dòng)閱讀 734評(píng)論 2 51