Я новичок в leetcode и получаю неправильный результат для решения этой проблемы, но я не вижу в этом никаких очевидных проблем. Когда я запускаю код на своем компьютере по вопросу, он не работает, но на сайте он дает неверный результат.
const leftBrackets = ["(", "{", "["];
const matchBrackets = { ")": "(", "}": "{", "]": "[" };
const testStack = [];
var isValid = function (s) {
for (const char of s) {
if (leftBrackets.includes(char)) {
testStack.push(char);
} else if (testStack[testStack.length - 1] === matchBrackets[char]) {
testStack.pop();
}
}
if (testStack.length === 0) return true;
else return false;
};
Это вопрос: https://leetcode.com/problems/valid-parentheses/submissions/
Это мой ответ на вопрос. Когда я запускаю его, сайт говорит, что код получил неправильный результат для «{[]}» в качестве ввода. Он говорит, что возвращает false, но когда я запускаю его в NodeJS на своем компьютере, он возвращает true. кто-нибудь знает, почему это произошло? Я просто хочу иметь возможность проверить, когда у меня есть решение проблемы. Я также хотел бы получить отзыв о моем решении, если вы все равно отвечаете. Я пытаюсь сделать свои решения более эффективными, не прибегая к простому поиску всего. Кажется, что это должно быть легко возможно с O (n).
Спасибо всем, кто ответит!
Обновлено: я добавил свое полное решение ниже, если кто-то, работающий над этим вопросом, увидит этот пост. Он очень хорошо справился со скоростью (56 мс, быстрее, чем 98%), поэтому я думаю, что он довольно эффективен. Также кажется случайным, сколько времени это займет, лол.
var isValid = function (s) {
const leftBrackets = ["(", "{", "["];
const matchBrackets = { ")": "(", "}": "{", "]": "[" };
const testStack = [];
if (s.length % 2 !== 0) return false;
for (const char of s) {
if (leftBrackets.includes(char)) {
testStack.push(char);
} else if (testStack[testStack.length - 1] === matchBrackets[char]) {
testStack.pop();
} else return false;
}
if (testStack.length === 0) return true;
else return false;
};
Вероятно, вам просто нужно переместить testStack
внутрь функции, иначе он будет сохраняться для всех вызовов isValid
. Вот еще один ложноотрицательный пример:
const leftBrackets = ["(", "{", "["];
const matchBrackets = { ")": "(", "}": "{", "]": "[" };
const testStack = [];
var isValid = function (s) {
for (const char of s) {
if (leftBrackets.includes(char)) {
testStack.push(char);
} else if (testStack[testStack.length - 1] === matchBrackets[char]) {
testStack.pop();
}
}
if (testStack.length === 0) return true;
else return false;
};
console.info(isValid('('));
console.info(isValid('[]'));
Так что просто сделай
var isValid = function (s) {
const testStack = [];
так что каждый вызов имеет свой собственный массив.
Ваш вопрос не включает описание проблемы, но потенциальная ошибка заключается в том, что вы не проверяете, используется ли неправильная правая скобка. Например, если вы хотите, чтобы строка
(])
чтобы потерпеть неудачу, вам нужно изменить свою логику - либо нажать, либо вытолкнуть, и если ни одно из условий не выполняется, возможно, вы захотите return false
.
Благодарю вас! Я думаю, что это было. Похоже, после добавления проверки на неровные начальные строки мне не хватает 3 крайних случаев, поэтому я поработаю над этим тогда.