给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()"示例 2:
输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()"示例 3:
输入:s = "" 输出:0
这道题的思想其实就是 栈空间 大家可以想想弹栈的过程。大家写代码的时候少敲一个括号是不是会报错呢。
我的代码给出了一个简单的 解题。不涉及数据结构的内容,也是用了递归,毕竟递归大法好~
废话不多说,直接上代码。
#include <stdio.h>
int ValParentheses(char arr[], int size, char *next1, char *next2, int idmax, int valmax)
{
if(next2 > &arr[size-1])//如果后指针指向的地址大于数组最后一个元素的地址,说明已查找完毕,程序结束
{
return valmax;//返回最大的那个值
}
if(*next1 == '(' && *next2 == ')')//前一个指针解引用后的内容和后一个指针解引用后的内容为【一组】,如果这一组满足条件
{
idmax += 1;//那么说明有一个连对(),匹配成功了,那么就把当前连对成功的个数+1
valmax = (valmax >= idmax) ? valmax :idmax;//把当前连对成功的个数和目前连对成功的最大个数,进行比较,谁大,valmax的值取谁,即,之前连对成功最大是2个连对,现在当前连对的个数是3个,那就把目前最大连对刷新到3
ValParentheses(arr, size, next1+2, next2+2, idmax, valmax); //当前连对成功了,把指针往后偏移2个目标,调用自己再进行判断
}
else
{
idmax = 0; //相反,如果前指针 解引用后的内容 和后指针解引用后的内容 不满足条件,说明连对到这就断了,连不下去了,那当前连对的个数就刷新成0
valmax = (valmax >= idmax) ? valmax : idmax; //这一步有没有无所谓,因为,刷新成0了,肯定是比目前最大连对值小了,
ValParentheses(arr, size, next1+1, next2+1, idmax, valmax);//既然这一组不能匹配成功,就将指针偏移一个目标,看看,下一组能不能匹配成功
}
}
int main()
{
char arr[] = {')','(',')','(',')','(',')',')','\0'};
char *next1 = &arr[0];//这个指针为前指针,一开始指向数组首元素的地址
char *next2 = &arr[1];//这个指针为后指针,一开始指向数组第二个元素的地址
int max = ValParentheses(arr, 8, next1, next2, 0, 0);//arr:数组地址,8:数组尺寸(不包含‘\0’),next1:前指针,后指针, 0:(indmx)目前连对成功的个数, 0:(valmax)程序目前最大的连对成功个数
printf("\n%d",max);
}