package com.interview.recursion;
import java.util.ArrayList;
import java.util.List;
/**
* Date 02/23/2016
* @author Tushar Roy
*
* Given a string eg. 123 and target e.g 6. Put operators *, +, - between 123 so that it evaluates to 6
*
* https://leetcode.com/problems/expression-add-operators/
*/
public class OperatorAdditionForTarget {
public List<String> addOperators(String num, int target) {
if (num.length() == 0) {
return new ArrayList<>();
}
List<String> result = new ArrayList<>();
StringBuffer buff = new StringBuffer();
dfs(num, 0, target, 0, 0, result, buff);
return result;
}
private void dfs(String nums, int pos, int target, long runningTotal, long multiplicationVal, List<String> result, StringBuffer buff) {
if (pos == nums.length()) {
if (runningTotal == target) {
result.add(buff.toString());
}
return;
}
for (int i = pos; i < nums.length(); i++) {
if (i != pos && nums.charAt(pos) == '0') {
break;
}
String subStr = nums.substring(pos, i + 1);
long num = Long.parseLong(subStr);
if (pos == 0) {
dfs(nums, i + 1, target, num, num, result, buff.append(num));
buff.delete(buff.length() - subStr.length(), buff.length());
continue;
}
dfs(nums, i + 1, target, runningTotal + num, num, result, buff.append("+").append(subStr));
buff.delete(buff.length() - subStr.length() - 1, buff.length());
dfs(nums, i + 1, target, runningTotal - num, -num, result, buff.append("-").append(subStr));
buff.delete(buff.length() - subStr.length() - 1, buff.length());
dfs(nums, i + 1, target, runningTotal + num * multiplicationVal - multiplicationVal, num * multiplicationVal,
result, buff.append("*").append(subStr));
buff.delete(buff.length() - subStr.length() - 1, buff.length());
}
}
public static void main(String args[]) {
OperatorAdditionForTarget p = new OperatorAdditionForTarget();
List<String> result = p.addOperators("1234", -1);
result.stream().forEach(s -> System.out.println(s));
}
}