package com.fishercoder.solutions;

import java.util.Stack;

/**
 * 20. Valid Parentheses
 *
 * Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.
 *
 * An input string is valid if:
 *
 * 1. Open brackets must be closed by the same type of brackets.
 * 2. Open brackets must be closed in the correct order.
 *
 * Note that an empty string is also considered valid.
 *
 * Example 1:
 * Input: "()"
 * Output: true
 *
 * Example 2:
 * Input: "()[]{}"
 * Output: true
 *
 * Example 3:
 * Input: "(]"
 * Output: false
 *
 * Example 4:
 * Input: "([)]"
 * Output: false
 *
 * Example 5:
 * Input: "{[]}"
 * Output: true
 * */
public class _20 {
    public static class Solution1 {
        public boolean isValid(String s) {
            Stack<Character> stack = new Stack<>();
            for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == '(' || s.charAt(i) == '{' || s.charAt(i) == '[') {
                    stack.push(s.charAt(i));
                } else {
                    if (stack.isEmpty()) {
                        return false;
                    } else {
                        if (stack.peek() == '(' && s.charAt(i) != ')') {
                            return false;
                        } else if (stack.peek() == '{' && s.charAt(i) != '}') {
                            return false;
                        } else if (stack.peek() == '[' && s.charAt(i) != ']') {
                            return false;
                        }
                        stack.pop();
                    }
                }
            }
            return stack.isEmpty();
        }
    }

    public static class Solution2 {
        /**
         * A more concise solution:
         * credit: https://leetcode.com/problems/valid-parentheses/discuss/9178/Short-java-solution
         * */
        public boolean isValid(String s) {
            Stack<Character> stack = new Stack<>();
            for (char c : s.toCharArray()) {
                if (c == '(') {
                    stack.push(')');
                } else if (c == '{') {
                    stack.push('}');
                } else if (c == '[') {
                    stack.push(']');
                } else if (stack.isEmpty() || stack.pop() != c) {
                    return false;
                }
            }
            return stack.isEmpty();
        }
    }
}

@@ -58,636 +58,8 @@
 k;%0A%0A
-/**%0A * 20. Valid Parentheses%0A *%0A * Given a string containing just the characters '(', ')', '%7B', '%7D', '%5B' and '%5D', determine if the input string is valid.%0A *%0A * An input string is valid if:%0A *%0A * 1. Open brackets must be closed by the same type of brackets.%0A * 2. Open brackets must be closed in the correct order.%0A *%0A * Note that an empty string is also considered valid.%0A *%0A * Example 1:%0A * Input: %22()%22%0A * Output: true%0A *%0A * Example 2:%0A * Input: %22()%5B%5D%7B%7D%22%0A * Output: true%0A *%0A * Example 3:%0A * Input: %22(%5D%22%0A * Output: false%0A *%0A * Example 4:%0A * Input: %22(%5B)%5D%22%0A * Output: false%0A *%0A * Example 5:%0A * Input: %22%7B%5B%5D%7D%22%0A * Output: true%0A * */%0A
 publ

refactor 20