常见编程题 - 括号匹配方案

一、合法的括号匹配序列被定义为:
1. 空串”“是合法的括号序列
2. 如果”X”和”Y”是合法的序列,那么”XY”也是一个合法的括号序列
3. 如果”X”是一个合法的序列,那么”[X]”也是一个合法的括号序列
4. 每个合法的括号序列都可以由上面的规则生成
例如”“, “[]”, “[][][]”, “[[][]]”, “[[[[]]]]”都是合法的。
牛牛现在给出一个括号序列s,牛牛允许你执行的操作是:在s的开始和结尾处添加一定数量的左括号(‘[‘)或者右括号(‘]’)使其变为一个合法的括号匹配序列。牛牛希望你能求出添加最少的括号之后的合法的括号匹配序列是什么。

var s = readline();
var count = 0;
var t = '';
for(var i in s) {
    if(s[i] === '[') {
        count++;
    }else {
        count--;
    }
    if(count < 0) {
        t = '[' + t;
        count = 0;
    }
}
while(count >= 1) {
    s += ']';
    count--;
}
print(t + s);

二、合法的括号匹配序列被定义为:
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

//法一
function test(str){
    var line = str.split('');
var count=1;
while(line.length) {
    var i = line.indexOf(')');
    count *= i;
    line.splice(i-1,2); 
}
return count;
}
console.log(test('(((())))'));
//法二
var s = readline();
var count = 0,
    result = 1;
for(var i in s) {
    if(s[i]==='(') {
        count++;
    }else if(s[i] === ')') {
        result *= count;
        count--;
    }
}
print(result);

猜你喜欢

转载自blog.csdn.net/qq_41401130/article/details/82494932
今日推荐