トピックへのリンク:https://leetcode-cn.com/problems/longest-valid-parentheses/
タイトル説明
のみを含む文字列を与えられた「(」と「」)、有効な括弧を含む最長のサブストリングの長さを見つけます。
例1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
例2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
考え
1つの+スタック暴力
偶数を横断する長さの各サブストリングには、文字列が有効な文字列のブラケットであるか否かを判定する。
決定するために文字列を横断しながら、スタックを維持します:
- それぞれの出会いのA「(」、プッシュ。
- あなたは「)」が発生した場合、先頭の要素をポップアップ表示されます。スタックが空またはフルサブ文字列トラバーサルスタック要素が残っている場合には、そのサブストリングが無効です。
複雑性分析
-
時間計算: 。複雑さが必要とされるすべての可能なストリング時間を生成するために、長さNの文字列から、 )。長さnの検証サブストリングに必要な時間 。
-
宇宙の複雑さ: 。サブストリングの長さは、最大nスタックでの深さを必要とするかもしれません。
=、=タイムアウトを実行します!!!
/*
* 栈+暴力
* 时间复杂度O(n^2) 空间复杂度O(n)
* 超时
*/
class Solution {
public:
int longestValidParentheses(string s) {
int maxLen = 0;
for (int i = 0; i < s.size(); ++i) { // i为起始坐标
for (int j = 2; j <= s.size() - i; j+=2) { // j为长度
if(isValid(s.substr(i,j)))
maxLen = max(maxLen, j);
}
}
return maxLen;
}
bool isValid(string s){
stack<char> stack1;
for(auto ch:s){
if(ch == '(')
stack1.push('(');
else if(stack1.empty()) // ) 匹配空栈
return false;
else
stack1.pop();
}
return stack1.empty();
}
};
2トラバーサルたら+スタック
複雑分析
時間複雑:O(n)の
空間の複雑さ:O(N)
class Solution {
public:
int longestValidParentheses(string s) {
if (s.size() < 2) return 0;
int len = s.size();
stack<int> st; // 左括号元素的index
st.push(-1);
int maxLen = 0;
for (int i = 0; i < len; ++i) {
if(s[i] == '(')
st.push(i);
else{
st.pop();
if(st.empty())
st.push(i);
else
maxLen = max(maxLen, i-st.top());
}
}
return maxLen;
}
};