DEV Community

truongductri01
truongductri01

Posted on

678. Valid Parenthesis String

Problem: 678. Valid Parenthesis String

First Approach

Can utilize a similar method like validating parenthesis.

Loop through each char c in the string s and check:

  • if c == *, increase countStar
  • if c == (, increase countLeft
  • if c == ), decrease countLeft if countLeft > 0. otherwise, if countStar > 0, decrease it, else return false.

At the end, if countStar >= countLeft, return true, else, return false.

This may sound like a good approach but this will fail since there is another restriction that we have not taken into consideration:
Left parenthesis '(' must go before the corresponding right parenthesis ')'.

That means if there is a star and a left parenthesis, the star must come after.

Correct Approach

We will utilize Stack and Queue to keep track of the index of the left parenthesis and the stars.

After removing all the right parenthesis like mentioned above, we will check the positions of the stars and left parenthesis to make sure it meet the requirements

Here is a simple explanation:

  • used stack for left paren and queue for star?
  • will store the int value (the index of the parent and star only)
  • if there is some right paren without left paren remove star from the top of the queue (smallest positions)

when there are only left paren left.

  • pop from the end => get the largest, if it does not satisfy => false
  • convert queue into stack for popped out
  • keep doing until empty
class Solution {
    public boolean checkValidString(String s) {
        Queue<Integer> starQ = new LinkedList<>();
        Stack<Integer> leftS = new Stack<>();


        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '*') {
                starQ.add(i);
            } else if (c == '(') {
                leftS.add(i);
            } else {
                // ) only 
                if (!leftS.isEmpty()) {
                    leftS.pop();
                } else {
                    if (!starQ.isEmpty()) {
                        starQ.remove();
                    } else {
                        return false;
                    }
                }
            }
        }

        if (leftS.isEmpty()) {
            return true;
        } else if (starQ.isEmpty()) {
            // this means still has left but no star 
            return false;
        } else {
            // convert 
            Stack<Integer> starS = new Stack<>();
            while (!starQ.isEmpty()) {
                starS.add(starQ.remove());
            }

            while (!starS.isEmpty() && !leftS.isEmpty()) {
                int left = leftS.pop();
                int star = starS.pop();

                if (star < left) {
                    return false;
                }
            }

            if (leftS.isEmpty()) {
                return true;
            }
            return false;
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay