最长有效括号(C语言)

题目链接:. - 力扣(LeetCode)

这道题,我看了一种解法,觉得很好,来分享一下

这道题主要是   思考    当前 )  与之匹配 ( 在哪里  ,记录下来,最后比较最大值

例子:

第一个右括号,由于没有与之匹配的左括号,所以不记录,但要更改起始位置

第一个左括号入栈,记录下标

第二个右括号有与之匹配的左括号,max = 2

第二个左括号入栈

第三个右括号,最长与之匹配的左括号是第一个左括号 max = 当前位置 - 起始位置 + 1

第四个右括号,没有与之匹配的左括号

难点在于:起始位置怎么变:当右括号进入,并且栈里没有左括号时,起始位置发生改变

例子:( ( ) ( ) 

主要是最后一个右括号与之匹配的左括号为第二个左括号

但是第二个左括号会被踢出去

所以找第一个左括号

由此代码写出:

typedef struct Stack

{

    int* arr;

    int size;

    int top;

}ST;

void StackInit( ST* obj )

{

    obj->arr = (int*)malloc(sizeof(int)*30005);

    obj->size = 0;

    obj->top = -1;

}

void StackPush( ST* obj , int pi )

{

    obj->arr[++obj->top] = pi;

    obj->size++;

}

void StackPop( ST* obj )

{

    obj->size--;

    obj->top--;

}

int StackTop( ST* obj )

{

    return obj->arr[obj->top];

}

bool StackIsEmpty( ST* obj )

{

    return obj->size==0;

}

int longestValidParentheses(char* s) {

    ST obj;

    StackInit( &obj);

    int i = 0;

    int max = 0;

    int start = 0;

    for( i = 0 ; s[i] != '\0' ; i++)

    {

        if( s[i] == '(' )

        {

            StackPush( &obj,i);

        }

        else

        {

            if( StackIsEmpty(&obj) )

                start = i + 1;

            else

            {

                StackPop(&obj);

                if( StackIsEmpty(&obj) )

                {

                    max = fmax ( max , i - start + 1 );

                }

                else

                {

                    max = fmax( max , i - StackTop(&obj) );

//这里要解释一下,为什么会写StackTop , 首先要明确删除的元素与取得元素是相邻的关系

//如果是这个关系  )()  并且左括号栈不为空 那么这两个必然会匹配或者start移动(就要为空)

// 第一种情况 ())()  此时为空,并且start移动

// 第二种情况 ()() 此时左括号栈为空

// 这两种情况均已已知条件不符

                }

            }

        }

    }

    return max;

}

相关推荐

  1. leetcode有效括号

    2024-03-30 15:02:02       15 阅读
  2. 【算法题】32. 有效括号

    2024-03-30 15:02:02       37 阅读
  3. LeetCode 32:有效括号

    2024-03-30 15:02:02       33 阅读
  4. LeetCode 32. 有效括号

    2024-03-30 15:02:02       35 阅读
  5. 每日leetcode--有效括号

    2024-03-30 15:02:02       22 阅读
  6. LeetCode_32_困难_有效括号

    2024-03-30 15:02:02       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-30 15:02:02       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-30 15:02:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-30 15:02:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-30 15:02:02       20 阅读

热门阅读

  1. Ant Design Vue 搜索下拉框

    2024-03-30 15:02:02       15 阅读
  2. MyISAM和InnoDB

    2024-03-30 15:02:02       17 阅读
  3. C++开源项目研究——gh0st远控(一)

    2024-03-30 15:02:02       18 阅读
  4. 华为NPU下安装apex

    2024-03-30 15:02:02       17 阅读
  5. DevOps流动:技术视角与价值流视角互为补充

    2024-03-30 15:02:02       17 阅读
  6. Golang基础-6

    2024-03-30 15:02:02       16 阅读