Skip to content

Instantly share code, notes, and snippets.

@pkulak
Created December 14, 2016 00:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pkulak/afbdc786216545f39eb264aabc2f0324 to your computer and use it in GitHub Desktop.
Save pkulak/afbdc786216545f39eb264aabc2f0324 to your computer and use it in GitHub Desktop.
Answer to an interview question
let opening = ['{', '[', '('];
let closing = ['}', ']', ')'];
let all = opening.concat(closing)
function validate(s) {
if (s.length == 0) return true;
// ignore unknown chars at the head
while (all.indexOf(s.charAt(0)) == -1) {
s = s.slice(1);
if (s.length == 0) return true;
}
let startToken = s.charAt(0);
let endToken = closing[opening.indexOf(startToken)];
let accm = "";
let pointer = 1;
let seen = 1
if (!endToken) return false;
for (; pointer < s.length; pointer++) {
if (s.charAt(pointer) == startToken) {
seen++;
} else if (s.charAt(pointer) == endToken) {
seen--;
}
if (seen == 0) {
break;
}
accm = accm + s.charAt(pointer);
}
// we're balanced, the area between our boundaries is valid, as is the rest
return seen == 0 && validate(accm) && validate(s.slice(pointer + 1));
}
let tests = [
"", "{", "}", "{}", "}{",
"{{}", "{}}", "{{}}", "}{}", "{}{",
"([{}])", "([{})]",
"{abc}", "abc{", "}abc",
"var a = function(){return 'b';}",
"var a = function(){return 'b';"
];
let results = [
true, false, false, true, false,
false, false, true, false, false,
true, false,
true, false, false,
true,
false
]
var fail = false;
for (let i = 0; i < tests.length; i++) {
if (validate(tests[i]) != results[i]) {
console.log("Test Failure: " + tests[i]);
fail = true;
}
}
if (!fail) {
console.log("All tests passed.");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment