Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как проверить комбинацию символов в строке? (https://javascript.ru/forum/misc/78635-kak-proverit-kombinaciyu-simvolov-v-stroke.html)

CryNet 12.10.2019 23:19

Цитата:

Сообщение от Alexandroppolus (Сообщение 513883)
Я не очень понял, что требуется. Это разновидность задачи о проверке скобочной целостности с тремя видами скобок?

она самая. Даже не разновидность :) Просто хотелось выйти за рамки самой задачи

рони 12.10.2019 23:26

CryNet,
https://javascript.ru/forum/css-html...teki-v-js.html

Alexandroppolus 13.10.2019 07:09

Цитата:

Сообщение от CryNet (Сообщение 513886)
она самая. Даже не разновидность :) Просто хотелось выйти за рамки самой задачи

Но символы * и # могут быть открывашками и закрывашками, эта роль, видимо, чередуется?
То есть '****' аналогична '()()', но не '(())', так?

CryNet 13.10.2019 13:23

так :)

Alexandroppolus 13.10.2019 18:24

var config = {
  '(': ')',
  '{': '}',
  '[': ']',
  '<': '>',
  '*': '*',
  '#': '#'
};

function checkParentheses(config, str) {
  if (!str || !config) { return true; }
  var stack = [];
  var closeChars = Object.create(null);
  Object.keys(config).forEach(function(open) {
    var close = config[open];
    closeChars[close] = open !== close;
  });
  for (var i = 0; i < str.length; ++i) {
    var char = str.charAt(i);
    var isClose = closeChars[char];
    var closeForChar = config[char];
    if (isClose) {
      if (!stack.length || stack.pop() !== char) {
        return false;
      }
    } else if (closeForChar) {
      stack.push(closeForChar);
    }
    if (char === closeForChar) {
      closeChars[char] = !closeChars[char];
    }
  }
  return !stack.length;
}

alert(checkParentheses(config, '(aaa*hjhg*)'));
alert(checkParentheses(config, '(aaa*hjhg)'));


Добавить новые символы будет нетрудно. Если открывашка совпадает с закрывашкой, то режим для символа переключается, начинаясь с открывашки


Часовой пояс GMT +3, время: 08:21.