@Rapen

Как собрать такую фиксированную функцию?

Функция, которая принимая строку из скобок возвращает true или false взависимости от его корректного порядка, например:
validBraces( "(){}[]" ) =>  true 
validBraces( "(}" ) => false 
validBraces( "[(])" ) =>  false 
validBraces( "([{}])" ) =>  true

В общем у меня есть свое решение данной задачи:
function validBraces(braces){

  var arr = braces.split('');
  
  for(var i = 0; i < arr.length; i++) { 
    
    if(arr[i] == "(" && arr[i+1] == ")" || arr[i] == "{" && arr[i+1] == "}" || arr[i] == "[" && arr[i+1] == "]"){
    return true;
    }else if (arr[i] == "(" && arr[arr.length-1] == ")" && arr[i+1] == "[" && arr[i+2] == "{" && arr[i+3] == "}" && arr[i+4] && "]"){
    return true;
    }
    return false;
    
  } 
}

Но такое решение не совсем идеальное, т.к задавая другие корректные расстановки он покажет false, как нормально реализовать эту функцию?
  • Вопрос задан
  • 177 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Стек. Открывающие скобки кладутся на стек, закрывающие снимают вершину стека и проверяют на корректность пары.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Как верно заметил Rsa97, чтобы проверять правильную вложенность скобок, открывающие скобки надо класть на стек:

function validBraces(text) {
    const stack = [];

    for (let c of text) {
        if ('([{'.includes(c)) stack.push(c);
        else if (')]}'.includes(c)) {
            if ('([{'.indexOf(stack.pop()) !== ')]}'.indexOf(c)) {
                return false;
            }
        }
    }
    return true;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы