@Sergo467

Почему функция возвращает undefined?

Эта функция должна удалять скобки вместе с содержимым, начиная с самых глубоких скобок, пока они не кончатся. Но если есть вложенные скобки, то она работает не так как я думаю и возвращает undefined. Пожалуйста расскажите в чём моя ошибка.

const removeParentheses=(s)=>{
  s=s.replace(/\([\w\s]*\)/g, "");
  let n=false;
  for(let i=0; i<s.length; i++){
    if(s[i]==="("||s[i]===")"){
      n=true;
      break;
    }
  }
  if(n===false){
    return  s;
  }
  else{
    removeParentheses(s);
  }
}
  • Вопрос задан
  • 94 просмотра
Решения вопроса 2
Alexandroppolus
@Alexandroppolus
кодир
твоя задача - хороший пример, где не надо в рекурсию. Можно легко переписать на цикл:

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 разница в скорости просто гигантская
Ответ написан
Комментировать
Fragster
@Fragster
помогло? отметь решением!
else{
    return removeParentheses(s);
  }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы