package com.interview.dynamic;
import java.util.HashSet;
import java.util.Set;
/**
* Date 01/07/2016
* @author Tushar Roy
*
* Given an expression with +, -, * and / operators. Tell if expression can evaluate to given result with different
* parenthesis combination.
* e.g expresson is 2*3-1 and result is 4, function should return true since 2*(3-1) evaluate to 4.
*
* Time complexity is O(n^5)
* Space complexity is O(n^3)
*/
public class ExpressionEvaluation {
public boolean evaluate(char[] expression, int result) {
int operands[] = new int[expression.length/2 + 1];
char operators[] = new char[expression.length/2];
int index1 = 0;
int index2 = 0;
operands[index1++] = expression[0] - '0';
for (int i = 1; i < expression.length; i += 2 ) {
operators[index2++] = expression[i];
operands[index1++] = expression[i+1] - '0';
}
Holder T[][] = new Holder[operands.length][operands.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 < operands.length; i++) {
T[i][i].add(operands[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 (int x : T[i][k].values()) {
for (int y : T[k + 1][j].values()) {
if (operators[k] == '/' && y == 0) {
continue;
}
T[i][j].add(operate(operators[k], x, y));
}
}
}
}
}
T[0][T.length-1].values().forEach((i -> System.out.print(i + " ")));
for (int i : T[0][T.length - 1].values()) {
if ( i == result) {
return true;
}
}
return false;
}
private int operate(char operator, int x, int y) {
switch (operator) {
case '+':
return x + y;
case '-':
return x - y;
case '*':
return x*y;
case '/':
return x/y;
default:
throw new IllegalArgumentException();
}
}
static class Holder {
private Set<Integer> valueHolder = new HashSet<>();
void add(Integer ch) {
valueHolder.add(ch);
}
Set<Integer> values() {
return valueHolder;
}
}
public static void main(String args[]) {
ExpressionEvaluation ee = new ExpressionEvaluation();
System.out.println(ee.evaluate("9*3+1/7".toCharArray(), 0));
}
}