package com.interview.recursion; import java.util.Deque; import java.util.LinkedList; public class Bracketology { public boolean matchBracket(char str[],int openCount,int pos){ if(str.length == pos){ if(openCount == 0){ return true; } return false; } if(str[pos] == '('){ openCount++; }else{ openCount--; } if(openCount < 0){ return false; } return matchBracket(str,openCount,pos+1); } private void printArray(char result[]){ for(int i=0; i < result.length; i++){ System.out.print(result[i]); } System.out.println(); } public void bracketPermutation(char result[],int n, int pos,int openCount,int closeCount){ if(pos == 2*n){ printArray(result); return; } if(openCount < n){ result[pos] = '('; bracketPermutation(result, n, pos+1,openCount+1,closeCount); } if(closeCount < openCount){ result[pos] = ')'; bracketPermutation(result, n, pos+1, openCount, closeCount+1); } } public boolean matchBracket(char []brackets){ Deque<Character> stack = new LinkedList<Character>(); for(Character ch : brackets){ char checkChar = getOpeningCharacter(ch); if(checkChar == 0){ stack.addFirst(ch); }else{ if(stack.size() == 0 || stack.peek() != checkChar){ return false; }else{ stack.pop(); } } } if(stack.size() > 0){ return false; } return true; } private Character getOpeningCharacter(char ch){ switch(ch){ case ')' : return '('; case ']' : return '['; case '}' : return '{'; default : return 0; } } public static void main(String args[]){ Bracketology matcher = new Bracketology(); //System.out.print(matcher.matchBracket("(())())".toCharArray(), 0, 0)); int n=4; char result[] = new char[n*2]; // matcher.bracketPermutation(result, n, 0, 0, 0); System.out.println(matcher.matchBracket("[({()}{}[])]".toCharArray())); } }