反向括号 \- Codefights

新手上路,请多包涵

我很难用 JavaScript 解决这个问题

给定一个由英文字母、标点符号、空白字符和括号组成的字符串 s。保证 s 中的括号形成一个规则的括号序列。

你的任务是反转每对匹配括号中的字符串,从最里面的那个开始。

例子

对于字符串 s = a(bc)de 输出应该是

reverseParentheses(s) = "acbde".

输入输出

[time limit] 4000ms (js)
[input] string s

由英文字母、标点符号、空白字符和括号组成的字符串。保证括号形成一个规则的括号序列。

约束:

5 ≤ x.length ≤ 55.

[输出] 字符串

它必须使用以下输入:

  1. s: a(bcdefghijkl(mno)p)q 预期输出: apmnolkjihgfedcbq
  2. s: co(de(fight)s) 预期输出: cosfighted

原文由 Annia J. Flores 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 435
2 个回答
function reverseParentheses(s) {
    if (s.includes('(')){
        return reverseParentheses(reverseOnce(s));
    } else {
        return s;
    }
}

function reverseOnce(s){
    var regexp = /\(([^()]*)\)/i;
    var subStr = regexp.exec(s)[1];
    subStr = subStr.split('').reverse().join('');
    return s.replace(regexp, subStr)
}

原文由 Vahan 发布,翻译遵循 CC BY-SA 3.0 许可协议

在JS中

使用正则表达式

function reverseInParentheses(s) {
    if (s.match(/\([a-z]*\)/)) {
        return reverseInParentheses(s.replace(/\([a-z]*\)/,
            Array.from(s.match(/\([a-z]*\)/)[0].replace(/\(|\)/g,'')).reverse().join('')));
    }
    else return s;
}

简单方法:-

 function reverseInParentheses(s) {
    while (true) {
        let c = s.indexOf(")");
        if (c === -1) break;
        let o = s.substring(0, c).lastIndexOf("(");
        let start = s.substring(0, o);
        let middle = s.substring(o + 1, c).split("").reverse().join("");
        let end = s.substring(c + 1, s.length);
        s = start + middle + end;
    }
    return s;
}

在 Python 中:

简单方法

def reverseInParentheses(s):
    return eval('"' + s.replace('(', '"+("').replace(')', '")[::-1]+"') + '"')

使用堆栈方法

def reverseInParentheses(s):
    stack = []
    for x in s:
        if x == ")":
            tmp = ""
            while stack[-1] != "(":
                tmp += stack.pop()
            stack.pop() # pop the (
            for item in tmp:
                stack.append(item)
        else:
            stack.append(x)

    return "".join(stack)

在 C++ 中

简单方法:-

reverseString 函数将使用交换方法反转字符串,而 reverseParentheses 函数将递归更新字符串。

 string reverseString(string s){
    for(int i = 0;i < s.length()/2;i++){
        char t = s[s.length()-1-i];
        s[s.length()-1-i] = s[i];
        s[i] = t;
    }
    return s;
}
string reverseInParentheses(string s) {
    int beg = 0;
    int end = s.length() - 1;
    for(int i = 0; i < s.length(); i++){
        if(s[i] == '(')
            beg = i;
        if(s[i] == ')'){
            end = i;
            string temp = s.substr(beg + 1, end - beg - 1);
            return reverseInParentheses(s.substr(0, beg) + reverseString(temp) + s.substr(end + 1));
         }
    }
    return s;
}

原文由 Vineet Jain 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题