1. 程式人生 > >longest valid parentheness 最長有效括號問題

longest valid parentheness 最長有效括號問題

題目要求:

        輸入一個字串s,裡面在只包含兩種字元 '('和 ')',例如s=“(()))(()”

        找到最長的一個子串,且其包含的括號成對合法出現,例如s中的第2到3個字元子串“()”,但它不是最長的,最長的是第1到4個字元子串“(())”。

解題思路:

        動態規劃+字串操作

       動態規劃的關鍵是為s建立一張表,用來記錄遍歷過的字元相對應的重要資訊。表的含義有多種,因此選擇何種含義是最為關鍵。好的含義往往事半功倍。以本題為例,一開始的思路是確定使用動態規劃方法,但dp是個大概念,具體到每個題目就必須有詳細的分析。首先,想到是定義兩個表maxlen和pos,然後從左往右遍歷s,其中maxlen[i]和pos[i]分別表示從第0到i個字元子串內的最大括號對的長度和位置,但具體分析下去發現情況十分複雜,分支太多。

       因此,參考網上的其他高手的想法。重新定義一個maxlen,maxlen[i]表示包含s[i]且向左延伸的最長合法括號對的長度。這裡補充一句,如果第一次定義的表不好用,那麼在鑽研一段時間後,應該考慮重新定義,正所謂條條大路通羅馬哈。問題的關鍵來了,如果使用和給這張表賦值,分以下這幾種情況:

1. s[i]=='('

    很明顯,沒有以'('結尾的合法括號對,所以maxlen[i]=0;

2. s[i]==')'

     如果能夠找到一個與')'(s[i])配對的‘(’,且左右括號內的字串是合法的,s[i]肯定是不等於0的(具體值請見下文),否則置為0。

     與s[i]=')'配對的'('出現的位置有三種可能,a.不存在,b.s[i-1], c.s[i-1]往左的位置,即小於i-1

a。s[i]=0

b。maxlen[i]=2+maxlen[i-2];(前提:i-2的位置存在),這個很好理解,符合maxlen[i]的含義

c。如果b不成立,說明s[i-1]=')',那麼此時與s[i]配對的‘(’肯定是在s[i-1]的“左邊”。

      這個“左邊”可以分為:在s[i-1]對應於的最長括號對內,即s[ i-maxlen[i-1], i-1 ];不在s[ i-maxlen[i-1], i-1 ]內。

      如果在,顯然不合理。原因如下:

      如果與s[i]配對的‘(’在s[ i-maxlen[i-1], i-1 ]中,那麼本來與‘(’配對的')'便會不合法。

      因此,應該不在s[ i-maxlen[i-1], i-1 ]內,即從s[i-1-maxlen[i-1]]開始向左一次判斷是否等於'('。

      如果s[i-1-maxlen[i-1]]==‘(’,那麼s[i]=2+maxlen[i-1]+maxlen[i-2-maxlen[i-1]](前提:i-2-maxlen[i-1]位置存在),否則說明s[i-1-maxlen[i-1]]==‘)’。根據前面的敘述,應該繼續遞迴查詢s[i-1-maxlen[i-1]]往左的內容。但是,仔細觀察便會發現遞迴的結果依然是判斷s[i-1-maxlen[i-1]],然而s[i-1-maxlen[i-1]]已經等於‘)’,說明不存在與s[i]配對的‘(’,即情況a,那麼s[i]=0。

程式碼如下:

class Solution {
public:
    int longestValidParentheses(string s) {
        if(s.size()<=1) return 0;
        
        int res(0);
        vector<int> maxlen(s.size(), 0);
        for(int i=1; i<s.size(); i++){
            if(s[i]==')'){
                if(s[i-1]=='('){
                    maxlen[i]= 2+( i-2>=0 ? maxlen[i-2] :0 );
                }
                else if(i-1-maxlen[i-1]>=0 && s[i-1-maxlen[i-1]]=='('){
                    maxlen[i]=2+maxlen[i-1]+( i-2-maxlen[i-1]>=0 ? maxlen[i-2-maxlen[i-1]] : 0 );
                }
            }
            res=max(res, maxlen[i]);
        }
        
        return res;
    }
};


相關推薦

longest valid parentheness 有效括號問題

題目要求:         輸入一個字串s,裡面在只包含兩種字元 '('和 ')',例如s=“(()))(()”         找到最長的一個子串,且其包含的括號成對合法出現,例如s中的第2到3個字元子串“()”,但它不是最長的,最長的是第1到4個字元子串“(())”。

LeetCode 32. Longest Valid Parentheses(有效括號)

原題 Given a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substr

[LeetCode] Longest Valid Parentheses 有效括號

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

LeetCode 32 — Longest Valid Parentheses(有效括號)

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

Longest Valid Parentheses 有效括號

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

leetcode 32. Longest Valid Parentheses 有效括號長度

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

[Swift]LeetCode32. 有效括號 | Longest Valid Parentheses

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

LeetCode 32 Longest Valid Parentheses(有效括號)(*)

翻譯 給定一個僅僅包含“(”或“)”的字串,找到其中最長有效括號子集的長度。 對於“(()”,它的最長有效括號子集是“()”,長度為2。 另一個例子“)()())”,它的最長有效括號子集是“()()”,其長度是4。 原文 Given a strin

LeetCode:32. Longest Valid Parentheses(有效匹配串)

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

leetcode第32題:有效括號(遇到一個奇葩的錯誤)

問題描述: 給一個只包含 '(' 和 ')' 的字串,找出最長的有效(正確關閉)括號子串的長度。 對於 "(()",最長有效括號子串為 "()" ,它的長度是 2。 另一個例子 ")()())",最長有效括號子

Leetcode演算法——32、有效括號字串

給定一個字串,只包含’(‘和’)’。 要求找到最長的有效的子串。 Example 1: Input: “(()” Output: 2 Explanation: The longest valid parentheses substring is “()” Example 2:

LeetCode---32.有效括號

題目來源:https://leetcode-cn.com/problems/longest-valid-parentheses/description/ 題目描述: 演算法描述: 1.定義一個maxLength記錄最長有效括號長度,beginIndex記錄有效括號的起始位置。

leetcode 32 有效括號 O(N)時間解法

題目: 給一個只包含 ‘(’ 和 ‘)’ 的字串,找出最長的有效(正確關閉)括號子串的長度。 對於 “(()”,最長有效括號子串為 “()” ,它的長度是 2。 另一個例子 “)()())”,最長有效括號子串為 “()()”,它的長度是 4。 連結: https://le

Leetcode 32:有效括號詳細的解法!!!)

給定一個只包含 '(' 和 ')' 的字串,找出最長的包含有效括號的子串的長度。 示例 1: 輸入: "(()" 輸出: 2 解釋: 最長有效括號子串為 "()" 示例 2: 輸入: ")()())" 輸出: 4 解釋: 最長有效括號子串為 "()()" 解題思路

leetcode題庫——有效括號

題目描述: 給定一個只包含 '(' 和 ')' 的字串,找出最長的包含有效括號的子串的長度。 示例 1: 輸入: "(()" 輸出: 2 解釋: 最長有效括號子串為 "()" 示例 2: 輸入: ")()())" 輸出: 4

Leetcode演算法Java全解答--32. 有效括號

Leetcode演算法Java全解答–32. 最長有效括號 文章目錄 Leetcode演算法Java全解答--32. 最長有效括號 題目 想法 結果 總結 程式碼 我的答案 大佬們的答案

棧-LeetCode32-有效括號

題目 給定一個只包含 '(' 和 ')' 的字串,找出最長的包含有效括號的子串的長度。 示例 1: 輸入: "(()" 輸出: 2 解釋: 最長有效括號子串為 "()" 示例 2: 輸入: ")()())" 輸出: 4 解釋: 最長有效括號子串為 "()()" 思路 明顯地,使用棧

LeetCode32-有效括號

最近這兩天有斷更了,大家知道是為什麼嗎?肯定不是因為是我懶哈(大家想要笑也要憋著)這兩天一直在研究回溯法,被折磨的死去活來的。終於是有些收穫了,所以會在這兩天再把我的一些關於解回溯法題目的心得分享出來,希望大家會有些收穫。寫的都會是很通俗易懂的大白話,會教大家怎麼寫遞迴的過程,因為回溯法雖然好用,但

【LeetCode】32. 有效括號

題目描述 給定一個只包含 '(' 和 ')' 的字串,找出最長的包含有效括號的子串的長度。 示例 1: 輸入: "(()" 輸出: 2 解釋: 最長有效括號子串為 "()" 示例 2: 輸入: ")()())" 輸出: 4 解釋: 最長有效括號子串為 "()()"

32. 有效括號

給定一個只包含 ‘(’ 和 ‘)’ 的字串,找出最長的包含有效括號的子串的長度。 示例 1: 輸入: “(()” 輸出: 2 解釋: 最長有效括號子串為 “()” 示例 2: 輸入: “)()())”