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))