JSFiddle - React, Tailwind, and code Playground

by Maiki Nahara

JavaScript

function nest(s) {
  if (typeof s != 'string') return null
  if (!s.length) return s
  let str = s
  const firstChar = str[0]
  const lastChar = str[str.length - 1]
  const closeBrakets = ['}', ']', ')']
  const openBrakets = ['{', '[', '(']

  const closeBraketsMap = {
    '}': '{',
    ']': '[',
    ')': '('
  }
  const openBraketsMap = {
    '{': '}',
    '[': ']',
    '(': ')'
  }
  if (closeBrakets.includes(firstChar)) str = closeBraketsMap[firstChar] + str
  if (openBrakets.includes(lastChar)) str = str + openBraketsMap[lastChar]
  let itsOk = true
  const strArr = str.split(' ')
  if (!nestedSubstring(strArr.join(''))) {
    if (!nestedSubstring(strArr[0])) {
      strArr.push(strArr[0])
      if (nestedSubstring(strArr.join(''))) return strArr.join('')
      return null
    }
    if (!nestedSubstring(strArr[strArr.length - 1])) {
      let tmp = ''
      strArr[strArr.length - 1].split('').forEach(char => {
        tmp = tmp + closeBraketsMap[char]
      })
      const result = str.split(' ')
      result.unshift(tmp)
      if (nestedSubstring(result)) return result.join(' ')
      return null
    }
  } else {
    return strArr.join(' ')
  }
  return str
}

function nestedSubstring(subS) {
  const brackets = {
    "{": "}",
    "(": ")",
    "[": "]"
  }

  const closedBrackets = ["}", ")", "]"]

  let stack = [];

  for (let i = 0; i < subS.length; i++) {
    if (brackets.hasOwnProperty(subS[i])) {
      stack.push(subS[i])
    } else if (brackets[stack[stack.length - 1]] == subS[i]) {
      stack.pop()
    } else if (closedBrackets.indexOf(subS[i]) !== -1) {
      return 0
    }
  }

  return stack.length === 0 ? 1 : 0
}

const test1 = `( )[ ]`
const test2 = `]-(`
const test3 = `} { [()] (()v()) } ])`
const test4 = ``
const test5 = `{[[]]}`
console.log(nest(test1))
console.log(nest(test2))
console.log(nest(test3))
console.log(nest(test4))
console.log(nest(test5))