|
|
Line 1: |
Line 1: |
− | You just need to maintain a count, like so:
| + | We are Anonymous |
− | | |
− | <pre>
| |
− | public static boolean isBalanced(String str) {
| |
− | int count = 0;
| |
− | | |
− | for (int i = 0, n = str.length(); i < n; i++) {
| |
− | switch (str.charAt(i)) {
| |
− | case '(':
| |
− | count++;
| |
− | break;
| |
− | case ')':
| |
− | count--;
| |
− | break;
| |
− | default:
| |
− | throw new IllegalArgumentException();
| |
− | }
| |
− | | |
− | if (count < 0) {
| |
− | System.out.println("Imbalance at index " + i);
| |
− | return false;
| |
− | }
| |
− | }
| |
− | | |
− | if (count != 0) {
| |
− | System.out.println("Imbalance at index " + (str.length() - 1));
| |
− | return false;
| |
− | }
| |
− | | |
− | return true;
| |
− | }
| |
− | </pre>
| |
− | | |
− | Another Approach to use stack in-order to solve this problem;
| |
− | | |
− | A. Read the string from left to right as CHR
| |
− | B. Keep pushing CHR until CHR is not ")"
| |
− | 1) Pop from stack once CHR == ")"
| |
− | if poped element is NOT "("
| |
− | return FAlse
| |
− | Repeat A
| |
− | --[[User:Max|Max]] 07:18, 16 June 2010 (EDT)
| |
− |
| |
− | ----
| |
− | The approach below maintains a stack where the index of each opening '(' is pushed onto the stack. As each closing ')' is found, the index of the matching '(' is popped off the stack.
| |
− | | |
− | The string is unbalanced if there:
| |
− | * is an attempt to pop an element off an empty stack. The position of the current character can be reported as the position of the first offending parenthesis.
| |
− | * are any elements left on the stack. The value of the first element in the stack can be reported as the position of the first offending parenthesis.
| |
− | <pre>
| |
− | #include <iostream>
| |
− | #include <stack>
| |
− | #include <string>
| |
− | | |
− | int main (int argc, char* argv[]) {
| |
− | if (argc != 2) {
| |
− | std::cout << "pass a string to check if it's parens are balanced" << std::endl;
| |
− | exit(1);
| |
− | }
| |
− | | |
− | std::stack<int> parens;
| |
− | std::string input = argv[1];
| |
− | | |
− | for (int i = 0; i < input.length(); i++) {
| |
− | char ch = input[i];
| |
− | if (ch == ')') {
| |
− | if (parens.size() == 0) {
| |
− | std::cout << "unmatched ')' at position: " << i << std::endl;
| |
− | exit(1);
| |
− | }
| |
− | parens.pop();
| |
− | }
| |
− | else if (ch == '(') {
| |
− | parens.push(i);
| |
− | }
| |
− | }
| |
− | if (parens.size() != 0) {
| |
− | while (parens.size() > 1) {
| |
− | parens.pop();
| |
− | }
| |
− | std::cout << "unmatched '(' at position: " << parens.top() << std::endl;
| |
− | exit(1);
| |
− | }
| |
− | else {
| |
− | std::cout << "parens balanced!" << std::endl;
| |
− | }
| |
− | }
| |
− | </pre>
| |
− | --[[User:Neonstalwart|Neonstalwart]] ([[User talk:Neonstalwart|talk]]) 22:47, 26 March 2015 (EDT)
| |
− | | |
− | ----
| |
− | | |
− | Max's first example above appears to incorrectly report the last character in the string as the offending index if there is a surplus of opening parentheses. The following solution (in JavaScript) takes a similar approach, but correctly reports the index of the first unmatched open parenthesis (more like Neonstalwart's solution, but without requiring a stack).
| |
− | | |
− | This function returns a number: -1 if balanced, otherwise the index of the first offending parenthesis.
| |
− | | |
− | <pre>
| |
− | function checkParens(str) {
| |
− | var numOpen = 0;
| |
− | var length = str.length;
| |
− | var offender;
| |
− | | |
− | for (var i = 0; i < length; i++) {
| |
− | if (str[i] === '(') {
| |
− | if (!numOpen) {
| |
− | // Store index of first open paren in case it is never closed
| |
− | offender = i;
| |
− | }
| |
− | numOpen++;
| |
− | }
| |
− | else if (str[i] === ')') {
| |
− | if (!numOpen) {
| |
− | // Closing paren with none open = instant fail
| |
− | return i;
| |
− | }
| |
− | numOpen--;
| |
− | }
| |
− | }
| |
− | | |
− | return numOpen === 0 ? -1 : offender;
| |
− | }
| |
− | </pre>
| |
− | --[[User:CnEY|CnEY]] ([[User talk:CnEY|talk]]) 23:15, 27 August 2015 (EDT)
| |
− | | |
− | [[Data-structures-TADM2E|Back to ''Data Structures'' Problems]]...
| |