列表

详情


JD15. 括号匹配方案

描述

合法的括号匹配序列被定义为:
1. 空串""是合法的括号序列
2. 如果"X"和"Y"是合法的序列,那么"XY"也是一个合法的括号序列
3. 如果"X"是一个合法的序列,那么"(X)"也是一个合法的括号序列
4. 每个合法的括号序列都可以由上面的规则生成
例如"", "()", "()()()", "(()())", "(((())))"都是合法的。 东东现在有一个合法的括号序列s,一次移除操作分为两步:
1. 移除序列s中第一个左括号
2. 移除序列s中任意一个右括号.保证操作之后s还是一个合法的括号序列
东东现在想知道使用上述的移除操作有多少种方案可以把序列s变为空
如果两个方案中有一次移除操作移除的是不同的右括号就认为是不同的方案。
例如: s = "()()()()()",输出 1 , 因为每次都只能选择被移除的左括号所相邻的右括号.
s = "(((())))",输出 24 , 第一次有 4 种情况, 第二次有 3 种情况, ... ,依次类推, 4 * 3 * 2 * 1 = 24

数据范围:输入的序列长度满足 ,保证输入的括号序列合法

输入描述

输入包括一行,一个合法的括号序列s,序列长度length.

输出描述

输出一个整数,表示方案数

示例1

输入:

(((())))

输出:

24

示例2

输入:

()()()

输出:

1

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2020-08-08

#include <stdio.h>
int main(){
    int lnum,sum,i;
    char str[50]={'\0'};
    scanf("%s",str);
    lnum=0;
    sum=1;
    for (i=0;i<strlen(str);i++){
        if (str[i]=='(') {
            lnum++;
            continue;
        }
        if (str[i]==')') {
            sum=sum*lnum;
            lnum--;
        }
    }
    printf("%d",sum);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 356KB, 提交时间: 2020-07-28

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 23
 
struct Stack{
    char *base;
    int top;
    int size;
};
 
void init_stack(struct Stack *s){
    s->base = (char *)malloc(sizeof(char) * MAX_SIZE);
    s->top = -1;
    s->size = 0;
}
 
bool isEmpty(struct Stack *s){
    if(s->top == -1)
        return true;
    else
        return false;
}
 
bool isFull(struct Stack *s){
    if(s->top == MAX_SIZE)
        return true;
    else
        return false;
}
 
void push(struct Stack *s, char a){
    if(isFull(s))
        return;
    else{
        s->base[++s->top] = a;
        s->size ++;
    }
     
}
 
char pop(struct Stack *s){
    if(!isEmpty(s)){
        char tmp = s->base[s->top--];
        s->size --;
        return tmp;
    }else
        exit(-1);
}
 
void process(char *s, int size){
//    int size = (int)strlen(s);
    struct Stack *stack = (struct Stack *)malloc(sizeof(struct Stack));
    init_stack(stack);
    int count = 1;
    for(int i = 0; i < size; i ++){
        if(s[i] == '(')
            push(stack, s[i]);
        else{
            count *= stack->size;
            pop(stack);
        }
    }
    printf("%d", count);
}
 
int main(int argc, const char * argv[]) {
    // insert code here...
    char s[20];
    scanf("%s", s);
    process(s, strlen(s));
    return 0;
}

上一题