给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
目录
思路一:利用栈的特性解决
先将左括号入栈,若后面栈顶为右括号则使前一个左括号出栈,最后输出最后一个右括号和栈底左括号之间的差值
#define MAX(a , b) ((a) > (b) ? (a) : (b))
int longestValidParentheses(char * s){
int len = strlen(s);
int max = 0;
int str[len+1];
int top = -1;
str[++top] = -1;
for(int i = 0; i < len; i++)
{
if(s[i] == '(')
{
str[++top] = i;
}
if(s[i] == ')')
{
--top;
if(top == -1)
{
str[++top] = i;
}
else
{
max = MAX(max , (i - str[top]));
}
}
}
return max;
}
时间复杂度O(n),空间复杂度O(n)
思路二:动态规划
做题历程:
因为括号的特性,使用栈会比较容易解决此类问题,使用栈的时候需要用一个指针来记录栈顶,此处使用top变量,若该位置为左括号则判断前面一位是否为右括号,为右括号则top--,最后输出最长有效括号,实际编写的过程中i的取值要考虑清楚
反省:
问题:
对于栈顶的判断还需考虑清楚
收获:
对括号匹配问题思路更加明确,利用栈先进后出的特性来找到匹配的括号。
总结:
括号匹配问题与栈关联紧密,熟悉栈的操作对解决括号匹配帮助很大。