Действительные скобки - CodeWars Challenge - JavaScript - PullRequest
4 голосов
/ 20 мая 2019

Для кодовых войн существует запрос , который просит вас проверить, допустима ли строка скобок, скобок и фигурных скобок.

Строка скобок считается действительнойесли все фигурные скобки сопоставлены с правильной фигурной скобкой.

Т.е. "()" является действительным, а "[(])" - нет.

"(){}[]" является действительным, а "[({})](]" - нет.И т. Д.

Мне удалось создать некоторую логику для проверки правильности количества открывающих и закрывающих фигурных скобок.

ATTEMPT :

function validBraces(braces) {

  let parenCount = 0;
  let squareBracketCount = 0;
  let curlyBraceCount = 0;

    for (let i =0; i < braces.length; i++) {
      let character = braces[i];
        if (character === "(") {
          parenCount -= 1;
          }
        if (character === ")") {
          parenCount += 1;
          }
        if (character === "[") {
          squareBracketCount -= 1;
          }
        if (character === "]") {
          squareBracketCount += 1;
        }
        if (character === "{") {
          curlyBraceCount -= 1;
        }
        if (character === "}") {
          curlyBraceCount += 1;
        }
      }
      if (parenCount === 0 && squareBracketCount === 0 && curlyBraceCount === 0) {
        return true;
      } 
      else {
        return false;
      }
}

Но я не смог придумать способ проверить, «закрывается» ли открывающая скобка перед открытием следующей скобки типа .

Может быть, что-то вроде этого?

if (
  (firstChar === "(" && lastChar === ")") ||
  (firstChar === "{" && lastChar === "}") ||
  (firstChar === "[" && lastChar === "]")
) {
  return true;
} else {
  return false;
}

Но тогда это нужно будет проверить в соответствии с моими другими if-statement ... (?)

EDIT : ключом к пониманию этой проблемы является то, что закрывающая скобка должна быть либо сразу после открывающей скобки, либо она должна быть "параллельной" - в симметрии с другой.

1 Ответ

2 голосов
/ 20 мая 2019

Вы можете использовать array, чтобы отследить ранее появившиеся открывающие скобки, и как только появится любой закрывающий тег, вам нужно сопоставить его с последним значением массива, если он совпадает, вытолкнуть последнее значение, иначе возвращать false вend, если вы остались с пустым массивом, верните true, иначе верните false

function validBraces(braces){
  let tracer = []
  for(let i=0;i < braces.length; i++){
    if ( braces[i] === "(" || braces[i] === "{" || braces[i] === "["){
      tracer.push(braces[i])
    } else{
      if(tracer.length === 0) return false
      let lastValue = tracer[tracer.length-1]
      if( (braces[i] === ']' && lastValue === '[') || (braces[i] === '}' && lastValue === '{') || (braces[i] === ')' && lastValue === '('))
      {
        tracer.pop()
      } else {
        break;
      }
    }
  }
  return tracer.length === 0
}


console.log(validBraces( "()" )) // true
console.log(validBraces( "[]" )) // true
console.log(validBraces( "{}" )) // true
console.log(validBraces( "(){}[]" )) // true
console.log(validBraces( "([{}])" )) // true
console.log(validBraces( "(}" )) // false
console.log(validBraces( "[(])" )) // false
console.log(validBraces( "({})[({})]" )) // true
console.log(validBraces( "(})" )) // false
console.log(validBraces( "(({{[[]]}}))" )) //true
console.log(validBraces( "{}({})[]" )) // true
console.log(validBraces( ")(}{][" )) // false
console.log(validBraces( "())({}}{()][][" )) // false
console.log(validBraces( "(((({{" ))  // false
console.log(validBraces( "}}]]))}])" )) // false
...