Gore Sometimes
Gore Sometimes

Reputation: 81

Valid Parenthesis Troubleshooting

I'm working on a coding challenge that involves valid parenthesis and I'm trying to troubleshoot why it's not giving me the intended response.

 function isValid(str) {

  if (str.length === 0)
    return true

  let matchingOpeningBracket, char
  let stack = []

  let openingBrackets = ['[', '<', '(']
  let closingBrackets = [']', '>', ')']

  for (let i = 0; i < str.length; i++) {
    char = str[i]

    if (closingBrackets.indexOf(char) > -1) {
      matchingOpeningBracket = openingBrackets[closingBrackets.indexOf(char)]
      if (stack.length == 0 || (stack.pop() != matchingOpeningBracket)) {
        return false
      }
    } else {
      stack.push(char)
    }
  }

  return (stack.length == 0)
};

When I try to check console.log(isValid('---(++++)---')) and console.log(isValid('before(middle[])after')) it gives me a false value but it should be passing as true according to the challenge key. I'm not sure what step I'm missing. The other tests examples are logging as intended as seen here except for the first 2.

//true // returns false
// let example1 = ("before(middle[])after")
//true //returns false
// let example1 = ("---(++++)---")
//true 
// let example1 = ("")
//false 
// let example1 = (")(")
//false
// let example1 = ("<(>)")
//true 
// let example1 = ("([<>()])")
//false
// let example1 = ("([)")

Upvotes: 3

Views: 80

Answers (4)

Ankit Jindal
Ankit Jindal

Reputation: 4030

Time complexity: O(n)

const isValid = (s) => {

    let st = [];
    let obj = {
        "{" : "}",
        "[" : "]",
        "(" : ")"
    };
    
    for(let i=0; i<s.length; i++) {
        let char = s[i];
        if(obj[char]) {
           st.push(char);
        }
        else if(obj[st.pop()] != char) {
            console.log(st.pop(), char, obj[st.pop()]);
            return false;
        }
    }
    return st.length === 0;
}

Upvotes: 0

pavan kumar
pavan kumar

Reputation: 823

I definitely would not want to complicate things so I am giving a simple solution, so if you see it fit you can use it :)

function isValid(str) {

  if (str.length === 0)
    return true

  let char;
  let stack = [];

  let openingBrackets = ['[', '<', '(']
  let closingBrackets = [']', '>', ')']

  matchesOpen = (val) => (val === '[' || val === '<' || val === '(')
  matchesclose = (val) => (val === ']' || val === '>' || val === ')')

  getOpeningBracket = (val) => {
    switch (val) {
      case ']':
        return '[';
      case ')':
        return '(';
      case '>':
        return '<';
      default:
        return '';
    }
  }

  for (let i = 0; i < str.length; i++) {
    char = str[i]
    if (matchesOpen(char)) {
      stack.push(char);
    } else if (matchesclose(char)) {
      if (stack.pop() !== getOpeningBracket(char)) return false;
    }
  }

  return (stack.length == 0)
};

console.log(isValid(('---(++++)---')))
console.log(isValid('before(middle[])after'))
console.log(isValid("---(++++)---"))

Upvotes: 1

DaveHowell
DaveHowell

Reputation: 1264

You’re pushing onto the stack every char that is not an opening parenthesis. You only want to push opening parentheses onto the stack.

Notice that you get a false result whenever there are non-parenthesis characters in the string.

Upvotes: 0

samgak
samgak

Reputation: 24417

You are pushing everything that is not a closing bracket onto the stack when you should ignore chars that are neither opening or closing brackets. Change your else condition to this:

else if (openingBrackets.indexOf(char) > -1) {
 

Upvotes: 1

Related Questions