твоя задача - хороший пример, где не надо в рекурсию. Можно легко переписать на цикл:
const removeParenthesesNR=(s)=>{
let len = -1;
while(len !== s.length) {
len = s.length;
s = s.replace(/\([^()]*\)/g, "");
}
return s;
}
но даже в этом варианте очень медленно работает на строках с большой глубиной вложенности скобок.
вот, более быстрый способ:
function removeParentheses(str) {
const arr = [];
let idx = 0, depth;
while (idx < str.length) {
const newIdx = str.indexOf('(', idx);
if (newIdx < 0) {
break;
}
arr.push(str.substring(idx, newIdx));
for (depth = 1, idx = newIdx + 1; idx < str.length && depth; ++idx) {
const c = str[idx];
depth = depth + (c === ')' ? -1 : c === '(' ? 1 : 0);
}
}
return arr.join('') + str.substr(idx);
}
если сравнивать на строках вида "(((((...)))))", то для глубины 100000 разница в скорости просто гигантская