<leetcode>NO.32最长有效括号

    xiaoxiao2022-06-27  265

    给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

    示例 1:

    输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()"

    示例 2:

    输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()" struct PosStack{ int pos; struct PosStack *next; }; static struct PosStack * push_into_stack(int val,struct PosStack *head) { struct PosStack *new_stack=(struct PosStack *)malloc(sizeof(struct PosStack)); new_stack->pos=val; new_stack->next=head; head=new_stack; return head; } static int pop_from_stack(struct PosStack **head) { if(!*head)return -1; int ret=(*head)->pos; struct PosStack *tmp=*head; *head=(*head)->next; free(tmp); tmp=NULL; return ret; } static void clear_stack(struct PosStack *head) { struct PosStack * tmp=NULL; while(head) { tmp=head; head=head->next; free(tmp); tmp=NULL; } } int longestValidParentheses(char * s){ int len=strlen(s); if(len<2)return 0; bool *state=(bool *)malloc(sizeof(bool)*len); memset(state,0,sizeof(bool)*len); struct PosStack *head=NULL; for(int i=0;i<len;i++) { if(s[i]=='(') { head=push_into_stack(i,head); } else { int pos=pop_from_stack(&head); if(pos==-1) { continue; } else { state[i]=true; state[pos]=true; } } } int max_size=0; int tmp_size=0; for(int i=0;i<len;++i) { if(state[i]) { tmp_size++; } else if(tmp_size!=0) { max_size=max_size>tmp_size?max_size:tmp_size; tmp_size=0; } } max_size=max_size>tmp_size?max_size:tmp_size; free(state); clear_stack(head); return max_size; }

    执行用时 : 12 ms, 在Longest Valid Parentheses的C提交中击败了85.04% 的用户

    内存消耗 : 9.5 MB, 在Longest Valid Parentheses的C提交中击败了5.06% 的用户


    最新回复(0)