Проверьте, сбалансированы ли кавычки и скобки

Попробуйте: отредактируйте файл .gtk-bookmarks в своей домашней папке и поместите туда свои папки:

gedit .gtk-bookmarks 

В качестве примера:

file:///home/yourname/Documents
file:///home/yourname/Images
file:///home/yourname/Downloads
1
задан 13 August 2018 в 15:19

2 ответа

function parenthesesAreBalanced(string) {
  var parentheses = "[]{}()",
    stack = [],
    i, character, bracePosition;
  var insideQuotes = false;

  for(i = 0; character = string[i]; i++) {
    if(character === '"') {
      insideQuotes = !insideQuotes;
      continue;
    }

    if(insideQuotes) {
      continue;
    }

    bracePosition = parentheses.indexOf(character);

    if(bracePosition === -1) {
      continue;
    }

    if(bracePosition % 2 === 0) {
      stack.push(bracePosition + 1); // push next expected brace position
    } else {
      if(stack.length === 0 || stack.pop() !== bracePosition) {
        return false;
      }
    }
  }

  return stack.length === 0 && !insideQuotes;
}


console.log('("back-to-school)"', parenthesesAreBalanced('("back-to-school)"'));

console.log('("back-to-school)', parenthesesAreBalanced('("back-to-school)'));

console.log('("back-to-school")', parenthesesAreBalanced('("back-to-school")'));

2
ответ дан 15 August 2018 в 17:01
  • 1
    Мне нравится ваше решение - мне потребовалось некоторое время, чтобы понять логику с продолжением и тот факт, что вы храните braceIndexes в стеке вместо реальных круглых скобок. И вы решили не хранить кавычки в стеке вообще - выбор булевого флага. Умная. Как вы пришли к этому решению? Меня действительно раздражает то, что я не мог сортировать его в голове, чтобы придумать алгоритм для проверки как parens, так и кавычек. – codeepic 13 August 2018 в 16:36
  • 2
    @codeepic Я думаю, что возможны многие точные решения, поскольку это зависит от того, как мы интерпретируем выражение. Возьмем, например, ""[("")]"". Первый подход, мы можем прочитать это как "", [("")], "". Второй подход заключается в том, что мы можем интерпретировать это как " "[("")]" ". Поэтому, когда мы рассматриваем ", поскольку начало или конец могут варьироваться и быть по-прежнему правильными. – vivek_23 13 August 2018 в 17:31
  • 3
    @codeepic - мне не нужно было много делать, вы и «оригинальное решение». делает большую часть тяжелой работы, и я просто добавил требуемую логику для обработки котировок. Идея проста - символ цитаты либо открывает, либо закрывает (вводит / оставляет) цитируемый раздел, поэтому поддерживайте логический флаг, чтобы указать это. В цитируемом разделе все остальное можно игнорировать - как строку. В конце концов, нам нужно проверить, нет ли открытой секции цитат. – Amit 14 August 2018 в 11:43
  • 4
    Привет @Amit - к сожалению, эта комбинация (ele AND car) OR ("ele car)") вернет true. – codeepic 15 August 2018 в 16:37

Вы можете попробовать разместить упорядоченный кортеж в стеке и проверить, исходя из этого.

[(,"],
[",)],
[(,"],
[",)]

== ("")("") example of a balanced stack.

[",(],
[",(],
[),"],
[),"]

== "("()")" another balanced stack


[(,"],
[),"]

== (")" trivial unbalanced stack

[(,)] <- trivial item, can ignore in implementation
[","] <- trivial item, can ignore in implementation

[",(],
[),(],
[),"]

== "()()" balanced stack

Я слишком устал, чтобы реально реализовать это, но, надеюсь, это дало вам несколько идей и иллюстративных примеров , Я вернусь к нему после того, как поспаю.

2
ответ дан 15 August 2018 в 17:01

Другие вопросы по тегам:

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