Зачем уменьшать () пропуск квадратных скобок? - PullRequest
3 голосов
/ 27 марта 2019

У меня есть этот код:

var isValid = function(s) {
    let arr = [...s];

    arr.reduce((acc, cur) => {
        console.log(`arr in reduce: ${arr}`);
        console.log(`acc: ${acc}`);
        console.log(`cur: ${cur}`);
        if ((acc && cur)
        && (
            (acc === '(' && cur === ')')
            || (acc === '{' && cur === '}')
            || (acc === '[' && cur === ']')
        )) {
            arr.splice(arr.indexOf(acc), 2);
            console.log(`arr after splice: ${arr}`);
            return arr;
        }
        else {
            console.log(`else statement: ${cur}`);
            return cur;
        }
    });

    return arr.length === 0 ? true : false;
};

console.log(isValid("()[]{}"));

Необходимо вернуть значение true, если:

  • Открытые скобки должны быть закрыты скобками того же типа.
  • Открытые скобки должны быть закрыты в правильном порядке.

Мой код не проходит этот тест "()[]{}": он всегда возвращает [,], и я не понимаю, почему,Я пытался использовать регулярные выражения, anscii для квадратных скобок, но это не работает.

Ответы [ 2 ]

4 голосов
/ 27 марта 2019

Вы можете взять объект для ожидаемых закрывающих символов, и, если открытый символ найден, поместить ожидаемый закрывающий символ в стек.

В противном случае проверить совмещенное значение с символом.

var isValid = function([...array]) {
        var stack = [],
            open =  { '(': ')', '[': ']', '{': '}' };
        return array.every(c => c in open ? stack.push(open[c]) : c === stack.pop())
            && !stack.length;
    };

console.log(isValid("()[]{}"));
console.log(isValid("(({}[()]))[]{}"));
console.log(isValid("()[]{}}"));
console.log(isValid("["));
3 голосов
/ 27 марта 2019

Поскольку сращивание меняет длину, вы заметите, просматривая ваши журналы, что [,] пропускается в тестах из-за этого (текущий индекс в шагах reduce больше не соответствует массиву) , Вам, вероятно, следует использовать копию вместо исходного массива при склеивании и протестировать этот массив:

Обратите внимание, что способ создания кода не будет работать с вложенными скобками / скобками. Вы также должны быть осторожны с использованием indexOf для поиска cur, потому что он вернет первое найденное, которое, если вы измените свой код, может не соответствовать вашему реальному cur.

var isValid = function(s) {
    let arr = [...s], copy = [...s];

    arr.reduce((acc, cur) => {
        console.log(`arr in reduce: ${arr}`);
        console.log(`copy in reduce: ${copy}`);
        console.log(`acc: ${acc}`);
        console.log(`cur: ${cur}`);
        if ((acc && cur)
        && (
            (acc === '(' && cur === ')')
            || (acc === '{' && cur === '}')
            || (acc === '[' && cur === ']')
        )) {
            copy.splice(copy.indexOf(acc), 2);
            console.log(`copy after splice: ${copy}`);
            return arr;
        }
        else {
            console.log(`else statement: ${cur}`);
            return cur;
        }
    });

    return copy.length === 0 ? true : false;
};

console.log(isValid("()[]{}"));
...