力扣题32. 最长有效括号

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例 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);



}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值