package com.interview.dynamic; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * Date 01/06/2016 * @author Tushar Roy * Let there be a binary operation for 3 symbols a, b, c and result of these binary operation given in a table. * Given an expression of these 3 symbols and a final result, tell if this expression can be parenthesize in certain * way to produce the final result. * * Time complexity is O(n^4) * Space complexity is O(n^3) */ public class SymbolExpressionEvaluation { public boolean evaluateExpression(char input[][], Map<Character, Integer> index, char[] expression, char result) { Holder[][] T = new Holder[expression.length][expression.length]; for (int i = 0; i < T.length; i++) { for (int j = 0; j < T.length; j++) { T[i][j] = new Holder(); } } for (int i = 0; i < expression.length; i++) { T[i][i].add(expression[i]); } for (int l = 2; l <= T.length; l++) { for (int i = 0; i <= T.length - l; i++) { int j = i + l - 1; for (int k = i; k < j; k++) { for (char ch : T[i][k].values()) { for (char ch1: T[k+1][j].values()) { T[i][j].add(input[index.get(ch)][index.get(ch1)]); } } } } } for (char ch : T[0][T.length-1].values()) { if ( result == ch) { return true; } } return false; } public static void main(String args[]) { Map<Character, Integer> index = new HashMap<>(); index.put('a', 0); index.put('b', 1); index.put('c', 2); char input[][] = {{'b', 'b', 'a'}, {'c', 'b', 'a'}, {'a', 'c', 'c'}}; SymbolExpressionEvaluation sbe = new SymbolExpressionEvaluation(); System.out.println(sbe.evaluateExpression(input, index, "bbbbac".toCharArray(), 'a')); } } class Holder { private Set<Character> valueHolder = new HashSet<>(); void add(Character ch) { valueHolder.add(ch); } Set<Character> values() { return valueHolder; } }