diff --git a/balanced_delimiter/solutions/BalancedDelimiters.java b/balanced_delimiter/solutions/BalancedDelimiters.java new file mode 100644 index 0000000..0dc285e --- /dev/null +++ b/balanced_delimiter/solutions/BalancedDelimiters.java @@ -0,0 +1,49 @@ +import java.util.HashMap; +import java.util.Map; +import java.util.Stack; + +public class BalancedDelimiters { + + private Map closeToOpen = new HashMap<>(); + + public BalancedDelimiters() { + closeToOpen.put(")", "("); + closeToOpen.put("]", "["); + closeToOpen.put("}", "{"); + + } + + public boolean isBalanced(String value) { + + Stack openValues = new Stack<>(); + + for (char ch : value.toCharArray()) { + + if (isOpen(ch)) { + openValues.push(String.valueOf(ch)); + } else if (isClose(ch)) { + String expectedOpenValue = getOpenValue(ch); + if (isNotMatched(openValues, expectedOpenValue)) return false; + } + } + return openValues.isEmpty(); + + + } + + private boolean isNotMatched(Stack openValues, String expectedOpenValue) { + return !openValues.pop().equals(expectedOpenValue); + } + + private String getOpenValue(char ch) { + return closeToOpen.get(String.valueOf(ch)); + } + + private boolean isOpen(char ch) { + return closeToOpen.containsValue(String.valueOf(ch)); + } + + private boolean isClose(char ch) { + return closeToOpen.containsKey(String.valueOf(ch)); + } +}