/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
final class BalancedParanthesis {
private static final Map
<Character, Character
> brackets
= new HashMap
<Character, Character
>(); static {
brackets.put('[', ']');
brackets.put('{', '}');
brackets.put('(', ')');
}
private BalancedParanthesis() {};
/**
* Returns true is parenthesis match open and close.
* Understands [], {}, () as the brackets
* It is clients responsibility to include only valid paranthesis as input.
* A false could indicate that either parenthesis did not match or input including chars other than valid paranthesis
*
* @param str the input brackets
* @return true if paranthesis match.
*/
public static boolean isBalanced
(String str
) { if (str.length() == 0) {
}
// odd number would always result in false
if ((str.length() % 2) != 0) {
return false;
}
final Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < str.length(); i++) {
if (brackets.containsKey(str.charAt(i))) {
stack.push(str.charAt(i));
} else if (stack.empty() || (str.charAt(i) != brackets.get(stack.pop()))) {
return false;
}
}
return true;
}
public static void main
(String[] args
) { System.
out.
println(isBalanced
("[[")); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpmaW5hbCBjbGFzcyBCYWxhbmNlZFBhcmFudGhlc2lzIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2hhcmFjdGVyLCBDaGFyYWN0ZXI+IGJyYWNrZXRzID0gbmV3IEhhc2hNYXA8Q2hhcmFjdGVyLCBDaGFyYWN0ZXI+KCk7CiAgICBzdGF0aWMgewogICAgICAgIGJyYWNrZXRzLnB1dCgnWycsICddJyk7CiAgICAgICAgYnJhY2tldHMucHV0KCd7JywgJ30nKTsKICAgICAgICBicmFja2V0cy5wdXQoJygnLCAnKScpOwogICAgfSAgCgogICAgcHJpdmF0ZSBCYWxhbmNlZFBhcmFudGhlc2lzKCkge307CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaXMgcGFyZW50aGVzaXMgbWF0Y2ggb3BlbiBhbmQgY2xvc2UuCiAgICAgKiBVbmRlcnN0YW5kcyBbXSwge30sICgpIGFzIHRoZSBicmFja2V0cwogICAgICogSXQgaXMgY2xpZW50cyByZXNwb25zaWJpbGl0eSB0byBpbmNsdWRlIG9ubHkgdmFsaWQgcGFyYW50aGVzaXMgYXMgaW5wdXQuCiAgICAgKiBBIGZhbHNlIGNvdWxkIGluZGljYXRlIHRoYXQgZWl0aGVyIHBhcmVudGhlc2lzIGRpZCBub3QgbWF0Y2ggb3IgaW5wdXQgaW5jbHVkaW5nIGNoYXJzIG90aGVyIHRoYW4gdmFsaWQgcGFyYW50aGVzaXMKICAgICAqIAogICAgICogQHBhcmFtIHN0ciAgIHRoZSBpbnB1dCBicmFja2V0cwogICAgICogQHJldHVybiAgICAgIHRydWUgaWYgcGFyYW50aGVzaXMgbWF0Y2guCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JhbGFuY2VkKFN0cmluZyBzdHIpIHsKICAgICAgICBpZiAoc3RyLmxlbmd0aCgpID09IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGxlbmd0aCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDAiKTsKICAgICAgICB9CiAgICAgICAgLy8gb2RkIG51bWJlciB3b3VsZCBhbHdheXMgcmVzdWx0IGluIGZhbHNlCiAgICAgICAgaWYgKChzdHIubGVuZ3RoKCkgJSAyKSAhPSAwKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGZpbmFsIFN0YWNrPENoYXJhY3Rlcj4gc3RhY2sgPSBuZXcgU3RhY2s8Q2hhcmFjdGVyPigpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKICAgICAgICAgICAgaWYgKGJyYWNrZXRzLmNvbnRhaW5zS2V5KHN0ci5jaGFyQXQoaSkpKSB7CiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN0ci5jaGFyQXQoaSkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN0YWNrLmVtcHR5KCkgfHwgKHN0ci5jaGFyQXQoaSkgIT0gYnJhY2tldHMuZ2V0KHN0YWNrLnBvcCgpKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSAKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9IAoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaXNCYWxhbmNlZCgiW1siKSk7CiAgICB9Cn0=