给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
原理:
创建一个标记数组,默认值全部为-1;
遇到右括号,向前匹配左括号,找到则将右括号标记为2,左括号标记为0
最后找出 连续的 >= 0 的 标记之和最大序列 即为最长有效括号
code:
//32
public static int LongestValidParentheses(string s)
{
int result = 0;
//创建一个数组a,将值全部赋值-1
int[]a= new int[s.Length];
for (int i = 0; i < a.Length; i++)
{
a[i] = -1;
}
for (int i = 0; i < s.Length; i++)
{
if (s[i]==')')
{
//如果满足条件,将当前的i给一个值
int current = i;
//向前循环找(
while (i>0&&i<=s.Length)
{
i--;
//如果遇到) 往前找是否有(且(下标为-1
if (s[i]=='('&&a[i]==-1)
{
//把为(标记为0
a[i] = 0;
//把)标记为2
a[current] = 2;
}
}
i = current;
}
}
//最后统计一下大于0的值
for (int i = 0; i < a.Length; i++)
{
if (a[i] > 0)
result += a[i];
}
return result;
}