LeetCode:32. 最長有效括號
阿新 • • 發佈:2019-01-23
題目
LeetCode:Longest Valid Parentheses
給定一個只包含'('
和')'
的字串,找出最長的包含有效括號的子串的長度。
示例:
輸入: "(()"
輸出: 2
解釋: 最長有效括號子串為"()"
思路
參考他人的程式碼
利用一個棧,棧頂永遠存前一個左括號的位置,當有匹配的右括號,則括號長度為當前位置 - 當前匹配左括號前一個左括號位置
,如果沒有前一個左括號,則序列長度就是當前位置的下標 + 1
其實這個題本質就是一個動態規劃的問題。
如果不明白,請仔細體會程式碼。
程式碼
class Solution {
public:
int longestValidParentheses(string s) {
vector<int> index;
int max = 0;
for (int i = 0; i < s.size(); i++)
{
//當碰到右括號才有可能存在有效序列,且有左括號與之匹配
if (s[i] == ')' && index.empty() == false && s[index.back()] == '(')
{
//左括號的下標出棧
index.pop_back();
if (index.empty() == true)
{
//如果序列為空,說明i + 1均為有效序列
max = i + 1;
}
else if (max < i - index.back())
{
//index存有效序列開始的下標,與i相差的值為有效序列長度
max = i - index.back();
}
}
else
{
//如果不是右括號或者沒有與之匹配的左括號,入棧下標
index.push_back(i);
}
}
return max;
}
};