From e6459f956c68a4957f24c846be467184c8e3a520 Mon Sep 17 00:00:00 2001
From: Ashkrit <ashkrit@gmail.com>
Date: Sun, 28 Jun 2015 17:47:44 +0800
Subject: [PATCH] Create BalancedDelimiters.java

---
 .../solutions/BalancedDelimiters.java         | 49 +++++++++++++++++++
 1 file changed, 49 insertions(+)
 create mode 100644 balanced_delimiter/solutions/BalancedDelimiters.java

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<String, String> closeToOpen = new HashMap<>();
+
+    public BalancedDelimiters() {
+        closeToOpen.put(")", "(");
+        closeToOpen.put("]", "[");
+        closeToOpen.put("}", "{");
+
+    }
+
+    public boolean isBalanced(String value) {
+
+        Stack<String> 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<String> 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));
+    }
+}