您的位置:首页 > 编程语言 > C语言/C++

LeetCode 31. Longest Valid Parentheses O(n)实现

2014-06-21 03:32 381 查看
dp数组初始化为0, dp[i]代表以下标s[i]结尾的最长合法括号串的长度。

递推公式:

if (s[i]==')' && i-1-dp[i-1]>=0 && s[i-1-dp[i-1]]=='(') // 边界检查
{
dp[i] = dp[i-1]+2;
if (i-dp[i] >= 0)  // 边界检查
{
dp[i] = dp[i] + dp[i-dp[i]];
}
}
当s[i]为反括号')',并且以是s[i-1]结尾的最长合法括号串前面的那个字符是正括号'(' [b]时,条件为真:[/b]
dp[i] = dp[i-1] + 2; 其中2是本身自己这对括号

再加上这条以s[i]结尾新括号串前的最长合法括号串的长度(dp[i-dp[i]], 可能为0). 

代码:

class Solution
{
public:
int longestValidParentheses(string s)
{
vector<int> dp(s.size(), 0);

for (int i = 1; i < s.size(); ++ i)
{
if (s[i]==')' && i-1-dp[i-1]>=0 && s[i-1-dp[i-1]]=='(') // 边界检查 { dp[i] = dp[i-1]+2; if (i-dp[i] >= 0) // 边界检查 { dp[i] = dp[i] + dp[i-dp[i]]; } }
}

return s.empty()? 0: *max_element(dp.begin(), dp.end());
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode DP string C++