32 Longest Valid Parenthese
题目链接:32 Longest Valid Parenthese
题意
给出一个由字符’(‘或’)’组成的字符串,求出该字符串中最长合法括号串的长度
解法
求符合要求的最长连续子序列,可用动态规划,L[i]表示以第i个位置结尾的最长合法括号串的长度,则有
L[i]=⎧⎩⎨⎪⎪⎪⎪⎪⎪0,L[i−2]+2,L[i−1−L[i−1]]+2+L[i−2−L[i−1]],0,s[i]==′(′s[i−1]==′)′且s[i−2]==′(′s[i−2]==′)′且以当前位置前一个位置结尾的最长合法括号串开始处前一个位置是′(′其他
用一个变量ans记录最大合法括号串,对于第二三种情况,每次都更新ans的值,使其保持在最大即可,最后返回ans。
代码
#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
class Solution {
public:
int longestValidParentheses(string s) {
int len = s.length();
int *L = new int[len + 1];
memset(L, 0, sizeof(int)*(len + 1));
int ans = 0;
for (int i = 2; i <= len; ++i) {
if (s[i - 1] == '(') {
L[i] = 0;
}
else {
if (s[i - 2] == '(') {
L[i] = L[i - 2] + 2;
ans = max(ans, L[i]);
}
else {
int target = i - 2 - L[i - 1];
if (target < 0 || s[target] != '(') {
L[i] = 0;
}
else {
L[i] = L[i - 1] + 2 + L[target];
ans = max(ans, L[i]);
}
}
}
}
return ans;
}
};
算法复杂度
算法复杂度为O(n)。n为输入字符串长度。
注意
动态规划数组中每个元素记录的最大合法括号串必须以对应位置结尾,不能只是从开始位置到对应位置形成的区间中的最大合法括号串的长度,因为每个对应位置上的字符必须确定。