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: 輸入: “)()())”