Size: a a a

2020 February 03

В

Виктория in JS Liberty
All Siris
ребят есть идеи алгоритма?

isValid("(foo)вкп()");      // true
isValid("(foo)");      // true
isValid("(f[o]{o})");  // true
isValid("[(){}()()]"); // true
isValid("(foo");       // false — нет закрывающей
isValid("{f[o}o]");    // false — скобки пересекаются
Алгоритм прост.
Задаешь стэк.
Проходишься циклом по строке, проверяешь, является ли символ открывающим, если да, кладёшь в стэк, если символ закрывающий, снимаешь значение со стэка, проверяешь соответствует ли этот открывающий символ закрывающему, если нет, значит скобки пересекаются, возвращаешь false.
После цикла смотришь, если стэк пуст, то скобки были расставлены корректно, иначе строка не валидна
источник

В

Виктория in JS Liberty
У меня есть реализация, если интересно
источник

С

Славик in JS Liberty
давай
источник

В

Виктория in JS Liberty
function isValid(str) {
let stack = [];
let tokens = ["()", "{}", "[]"];
let map = tokens.reduce((acc, pair) => {
 acc.opening = acc.opening || {};
 acc.closing = acc.closing || {};
 acc.opening[pair[0]] = pair[1];
 acc.closing[pair[1]] = pair[0];
 return acc;
}, {});
for (let i = 0; i < str.length; i++) {
 let token = str[i];
 if (map.opening[token]) {
  stack.push(token);
 }
 if (map.closing[token]) {
  let lastToken = stack.pop();
  if (lastToken !== map.closing[token]) {
   return false;
  }
 }
}
return stack.length === 0;
}
источник

DE

Denis Efremov in JS Liberty
Виктория
function isValid(str) {
let stack = [];
let tokens = ["()", "{}", "[]"];
let map = tokens.reduce((acc, pair) => {
 acc.opening = acc.opening || {};
 acc.closing = acc.closing || {};
 acc.opening[pair[0]] = pair[1];
 acc.closing[pair[1]] = pair[0];
 return acc;
}, {});
for (let i = 0; i < str.length; i++) {
 let token = str[i];
 if (map.opening[token]) {
  stack.push(token);
 }
 if (map.closing[token]) {
  let lastToken = stack.pop();
  if (lastToken !== map.closing[token]) {
   return false;
  }
 }
}
return stack.length === 0;
}
Почему везде let?
источник

В

Виктория in JS Liberty
Denis Efremov
Почему везде let?
А что?
источник

BM

Brs Mdrk in JS Liberty
Denis Efremov
Почему везде let?
а что в этом плохого?
источник

T

Th0r in JS Liberty
надо по очереди let и var использовать же
источник

DE

Denis Efremov in JS Liberty
Ну как бы надо const юзать имхо
источник

DE

Denis Efremov in JS Liberty
let только там где нужно
источник

С

Славик in JS Liberty
да пофиг же
источник

В

Виктория in JS Liberty
Denis Efremov
Ну как бы надо const юзать имхо
Константы использую по их прямому назначению
источник

BM

Brs Mdrk in JS Liberty
это же давний срач, у которого нет смысла)
источник

В

Виктория in JS Liberty
Brs Mdrk
это же давний срач, у которого нет смысла)
Согласна
источник

DE

Denis Efremov in JS Liberty
Виктория
Константы использую по их прямому назначению
const — это не константы по сути
источник

В

Виктория in JS Liberty
Denis Efremov
const — это не константы по сути
А что?
источник

DE

Denis Efremov in JS Liberty
Переменные которые нельзя переназначать
источник

DE

Denis Efremov in JS Liberty
А константы нельзя изменять
источник

С

Славик in JS Liberty
Виктория
function isValid(str) {
let stack = [];
let tokens = ["()", "{}", "[]"];
let map = tokens.reduce((acc, pair) => {
 acc.opening = acc.opening || {};
 acc.closing = acc.closing || {};
 acc.opening[pair[0]] = pair[1];
 acc.closing[pair[1]] = pair[0];
 return acc;
}, {});
for (let i = 0; i < str.length; i++) {
 let token = str[i];
 if (map.opening[token]) {
  stack.push(token);
 }
 if (map.closing[token]) {
  let lastToken = stack.pop();
  if (lastToken !== map.closing[token]) {
   return false;
  }
 }
}
return stack.length === 0;
}
годно
источник

С

Славик in JS Liberty
но объект уже могла и сама задать =)
источник