6.23 - hard - 6

32. Longest Valid Parentheses:

這題有幾個(gè)難點(diǎn),一是得想到用DP來(lái)做,我一開(kāi)始用了stack做了一會(huì),發(fā)現(xiàn)不行,要記錄不同時(shí)候的狀態(tài),然后就想著用DP來(lái)做,結(jié)果折騰了半天,DP做出了一個(gè)TLE的版本。DP的想法是依次找,先找到相鄰的 () 然后找(xx)中間有兩個(gè)的,再分為兩種情況 “(x” & “x)” 或者 “xx” 是valid,然后再找四個(gè)的,也就是(xxxx),分為這些情況(x&xxx) (xxx & x) xxxx這些如果是valid那么(xxxx)就是valid。不過(guò)最后還是TLE了,想法倒是沒(méi)錯(cuò),不過(guò)時(shí)間復(fù)雜度變n^2了。

(續(xù)。。。)
然后看了答案,發(fā)現(xiàn)解法還是用stack,簡(jiǎn)直是打臉。

想法是記錄每個(gè) "("的index到stack里,這個(gè)我也想到了,但是不忙著計(jì)算當(dāng)前長(zhǎng)度,等到所有的值全部loop 完了,再?gòu)膕tack里依次pop來(lái)計(jì)算兩個(gè)pop出來(lái)之間的長(zhǎng)度。還有一個(gè)條件就是如果stack為空,并且cur = ")"的話,把這個(gè)index也加到stack里去。

所以事實(shí)證明一開(kāi)始的思路還是可以的,只是當(dāng)要記錄狀態(tài)的時(shí)候,沒(méi)想到如何用存在stack里的index來(lái)記錄狀態(tài)。

class Solution(object):
    def longestValidParentheses(self, s):
        """
        :type s: str
        :rtype: int
        """
        #一開(kāi)始想的是stack,但是試了幾下,發(fā)現(xiàn)要記錄住之前的狀態(tài),然后想著用dp試試
        # dp[i][j] start with index i end with index j if it is valid
        # dp[i][j] is valid only if dp[i+1][j-1] is valid and s[i] == "(" and s[j] == ")"
        dp = [[False for _ in range(len(s))] for _ in range(len(s))]
        
        res = 0
        for i in range(len(s)):
            for j in range(len(s)):
                if i > j:
                    dp[i][j] = True
                if j - i == 1 and s[i] == "(" and s[j] == ")":
                    dp[i][j] = True

        l = 1
        while l < len(s):
            for i in range(len(s)-1):
                j = i+l
                if j < len(s):
                    if s[i] == "(" and s[j] == ")":
                        dp[i][j] = dp[i][j] or dp[i+1][j-1]
                        for k in range(i+1, j-1):
                            dp[i][j] = dp[i][j] or (dp[i][k] and dp[k+1][j])
                        if dp[i][j]:
                            res = max(res, j-i+1)
            l += 2
        
        return res
class Solution(object):
    def longestValidParentheses(self, s):
        """
        :type s: str
        :rtype: int
        """
        res = 0
        stack = []
        for i in range(len(s)):
            if s[i] == '(': 
                stack.append(i)
            else:
                if stack:
                    if s[stack[-1]] == '(':
                        stack.pop()
                    else:
                        stack.append(i)
                else:
                    stack.append(i)
                    
        if not stack:
            res = len(s)
        else:
            a = len(s)
            b = 0
            while stack:
                b = stack.pop()
                res = max(res, a-b-1)
                a = b
            res = max(res, a);
            
        return res
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,907評(píng)論 0 33
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,996評(píng)論 25 709
  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會(huì)員),僅算法題,的吐槽 https://leetc...
    蕾娜漢默閱讀 18,370評(píng)論 2 36
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,652評(píng)論 18 399
  • 前些日子,美國(guó)總統(tǒng)候選人辯論開(kāi)戰(zhàn)。這場(chǎng)90分鐘的辯論估計(jì)吸引了超過(guò)1億人觀看,我們情不自禁感嘆美國(guó)人對(duì)自己觀點(diǎn)陳述...
    吳瓊Cissy閱讀 1,393評(píng)論 0 11

友情鏈接更多精彩內(nèi)容