Open In App

Print all possible expressions that evaluate to a target

Given a string that contains only digits from 0 to 9, and an integer value, target. Find out how many expressions are possible which evaluate to target using binary operator +, – and * in given string of digits.
 

Input : "123",  Target : 6
Output : {“1+2+3”, “1*2*3”}

Input : “125”, Target : 7
Output : {“1*2+5”, “12-5”}


 




This problem can be solved by putting all possible binary operator in mid between two digits and evaluating them and then check they evaluate to target or not. 
 


See below example for better understanding – 
 



Input is 125, suppose we have reached till 1+2 now,
Input = “125”, current expression = “1+2”, 
position = 2, current val = 3, last = 2

Now when we go for multiplication, we need last 
value for evaluation as follows:

current val = current val - last + last * current val

First we subtract last and then add last * current 
val for evaluation, new last is last * current val.
current val = 3 – 2 + 2*5 = 11
last = 2*5 = 10 


Another thing to note in below code is, we have ignored all numbers which start from 0 by imposing a condition as first condition inside the loop so that we will not process number like 03, 05 etc.
See the use of c_str() function, this function converts the C++ string into C char array, this function is used in below code because atoi() function expects a character array as an argument not the string. It converts character array to number.
 

// C++ program to find all possible expression which
// evaluate to target
#include <bits/stdc++.h>
using namespace std;
 
// Utility recursive method to generate all possible
// expressions
void getExprUtil(vector<string>& res, string curExp,
                 string input, int target, int pos,
                 int curVal, int last)
{
    // true if whole input is processed with some
    // operators
    if (pos == input.length())
    {
        // if current value is equal to target
        //then only add to final solution
        // if question is : all possible o/p then just
        //push_back without condition
        if (curVal == target)
            res.push_back(curExp);
        return;
    }
 
    // loop to put operator at all positions
    for (int i = pos; i < input.length(); i++)
    {
        // ignoring case which start with 0 as they
        // are useless for evaluation
        if (i != pos && input[pos] == '0')
            break;
 
        // take part of input from pos to i
        string part = input.substr(pos, i + 1 - pos);
 
        // take numeric value of part
        int cur = atoi(part.c_str());
 
        // if pos is 0 then just send numeric value
        // for next recursion
        if (pos == 0)
            getExprUtil(res, curExp + part, input,
                     target, i + 1, cur, cur);
 
 
        // try all given binary operator for evaluation
        else
        {
            getExprUtil(res, curExp + "+" + part, input,
                     target, i + 1, curVal + cur, cur);
            getExprUtil(res, curExp + "-" + part, input,
                     target, i + 1, curVal - cur, -cur);
            getExprUtil(res, curExp + "*" + part, input,
                     target, i + 1, curVal - last + last * cur,
                     last * cur);
        }
    }
}
 
// Below method returns all possible expression
// evaluating to target
vector<string> getExprs(string input, int target)
{
    vector<string> res;
    getExprUtil(res, "", input, target, 0, 0, 0);
    return res;
}
 
// method to print result
void printResult(vector<string> res)
{
    for (int i = 0; i < res.size(); i++)
        cout << res[i] << " ";
    cout << endl;
}
 
// Driver code to test above methods
int main()
{
    string input = "123";
    int target = 6;
    vector<string> res = getExprs(input, target);
    printResult(res);
 
    input = "125";
    target = 7;
    res = getExprs(input, target);
    printResult(res);
    return 0;
}

                    
// Java program to find all possible expression which
// evaluate to target
 
import java.util.ArrayList;
 
class GFG {
 
    // Utility recursive method to generate all possible
    // expressions
    static void getExprUtil(ArrayList<String> res,
                            String curExp, String input,
                            int target, int pos, int curVal,
                            int last)
    {
        // true if whole input is processed with some
        // operators
        if (pos == input.length()) {
            // if current value is equal to target
            // then only add to final solution
            // if question is : all possible o/p then just
            // push_back without condition
            if (curVal == target)
                res.add(curExp);
            return;
        }
 
        // loop to put operator at all positions
        for (int i = pos; i < input.length(); i++) {
            // ignoring case which start with 0 as they
            // are useless for evaluation
            if (i != pos && input.charAt(pos) == '0')
                break;
 
            // take part of input from pos to i
            String part = input.substring(pos, i + 1);
 
            // take numeric value of part
            int cur = Integer.parseInt(part);
 
            // if pos is 0 then just send numeric value
            // for next recursion
            if (pos == 0)
                getExprUtil(res, curExp + part, input,
                            target, i + 1, cur, cur);
 
            // try all given binary operator for evaluation
            else {
                getExprUtil(res, curExp + "+" + part, input,
                            target, i + 1, curVal + cur,
                            cur);
                getExprUtil(res, curExp + "-" + part, input,
                            target, i + 1, curVal - cur,
                            -cur);
                getExprUtil(res, curExp + "*" + part, input,
                            target, i + 1,
                            curVal - last + last * cur,
                            last * cur);
            }
        }
    }
 
    // Below method returns all possible expression
    // evaluating to target
    static ArrayList<String> getExprs(String input,
                                      int target)
    {
        ArrayList<String> res = new ArrayList<String>();
        getExprUtil(res, "", input, target, 0, 0, 0);
        return res;
    }
 
    // method to print result
    static void printResult(ArrayList<String> res)
    {
        for (int i = 0; i < res.size(); i++)
            System.out.print(res.get(i) + " ");
        System.out.println();
    }
 
    // Driver code to test above methods
    public static void main(String[] args)
    {
        String input = "123";
        int target = 6;
        ArrayList<String> res = getExprs(input, target);
        printResult(res);
 
        input = "125";
        target = 7;
        res = getExprs(input, target);
        printResult(res);
    }
}
 
// This code is contributed by jainlovely450.o

                    
# Python3 program to find all possible expression which
# evaluate to target
 
# Utility recursive method to generate all possible
# expressions
def getExprUtil(res, curExp, _input, target, pos, curVal, last):
    # true if whole input is processed with some
    # operators
    if (pos == len(_input)):
        # if current value is equal to target
        #then only add to final solution
        # if question is : all possible o/p then just
        #push_back without condition
        if (curVal == target):
            res.append(curExp)
        return
     
 
    # loop to put operator at all positions
    for i in range(pos,len(_input)):
        # ignoring case which start with 0 as they
        # are useless for evaluation
        if (i != pos and _input[pos] == '0'):
            break
 
        # take part of input from pos to i
        part = _input[pos: i + 1].strip()
 
        # take numeric value of part
        cur = int(part)
 
        # if pos is 0 then just send numeric value
        # for next recursion
        if (pos == 0):
            getExprUtil(res, curExp + part, _input,
                     target, i + 1, cur, cur)
 
 
        # try all given binary operator for evaluation
        else:
            getExprUtil(res, curExp + "+" + part, _input,
                     target, i + 1, curVal + cur, cur)
            getExprUtil(res, curExp + "-" + part, _input,
                     target, i + 1, curVal - cur, -cur)
            getExprUtil(res, curExp + "*" + part, _input,
                     target, i + 1, curVal - last + last * cur,
                     last * cur)
         
     
 
 
# Below method returns all possible expression
# evaluating to target
def getExprs(_input, target):
    res=[]
    getExprUtil(res, "", _input, target, 0, 0, 0)
    return res
 
 
# method to print result
def printResult(res):
    for i in range(len(res)):
        print(res[i],end=" ")
    print()
 
 
# Driver code to test above methods
if __name__ == '__main__':
    _input = "123"
    target = 6
    res = getExprs(_input, target)
    printResult(res)
 
    _input = "125"
    target = 7
    res = getExprs(_input, target)
    printResult(res)

                    
// C# program to find all possible expression which
// evaluate to target
using System;
using System.Collections.Generic;
class GFG {
 
  // Utility recursive method to generate all possible expressions
  static void getExprUtil(List<string> res, string curExp,
                          string input, int target, int pos,
                          int curVal, int last)
  {
 
    // true if whole input is processed with some
    // operators
    if (pos == input.Length)
    {
      // if current value is equal to target
      //then only add to final solution
      // if question is : all possible o/p then just
      //push_back without condition
      if (curVal == target)
        res.Add(curExp);
      return;
    }
 
    // loop to put operator at all positions
    for (int i = pos; i < input.Length; i++)
    {
      // ignoring case which start with 0 as they
      // are useless for evaluation
      if (i != pos && input[pos] == '0')
        break;
 
      // take part of input from pos to i
      string part = input.Substring(pos, i + 1 - pos);
 
      // take numeric value of part
      int cur = Int32.Parse(part);
 
      // if pos is 0 then just send numeric value
      // for next recursion
      if (pos == 0)
        getExprUtil(res, curExp + part, input,
                    target, i + 1, cur, cur);
 
 
      // try all given binary operator for evaluation
      else
      {
        getExprUtil(res, curExp + "+" + part, input,
                    target, i + 1, curVal + cur, cur);
        getExprUtil(res, curExp + "-" + part, input,
                    target, i + 1, curVal - cur, -cur);
        getExprUtil(res, curExp + "*" + part, input,
                    target, i + 1, curVal - last + last * cur,
                    last * cur);
      }
    }
  }
 
  // Below method returns all possible expression
  // evaluating to target
  static List<string> getExprs(string input, int target)
  {
    List<string> res = new List<string>();
    getExprUtil(res, "", input, target, 0, 0, 0);
    return res;
  }
 
  // method to print result
  static void printResult(List<string> res)
  {
    for (int i = 0; i < res.Count; i++)
      Console.Write(res[i] + " ");
    Console.WriteLine();
  }
 
  static void Main()
  {
    string input = "123";
    int target = 6;
    List<string> res = getExprs(input, target);
    printResult(res);
 
    input = "125";
    target = 7;
    res = getExprs(input, target);
    printResult(res);
  }
}
 
// This code is contributed by divyesh072019.

                    
<script>
    // Javascript program to find all possible expression which
    // evaluate to target
     
    // Utility recursive method to generate all possible
    // expressions
    function getExprUtil(res, curExp, input, target, pos, curVal, last)
    {
        // true if whole input is processed with some
        // operators
        if (pos == input.length)
        {
            // if current value is equal to target
            //then only add to final solution
            // if question is : all possible o/p then just
            //push_back without condition
            if (curVal == target)
                res.push(curExp);
            return;
        }
 
        // loop to put operator at all positions
        for (let i = pos; i < input.length; i++)
        {
            // ignoring case which start with 0 as they
            // are useless for evaluation
            if (i != pos && input[pos] == '0')
                break;
 
            // take part of input from pos to i
            let part = input.substr(pos, i + 1 - pos);
 
            // take numeric value of part
            let cur = parseInt(part, 10);
 
            // if pos is 0 then just send numeric value
            // for next recursion
            if (pos == 0)
                getExprUtil(res, curExp + part, input,
                         target, i + 1, cur, cur);
 
 
            // try all given binary operator for evaluation
            else
            {
                getExprUtil(res, curExp + "+" + part, input,
                         target, i + 1, curVal + cur, cur);
                getExprUtil(res, curExp + "-" + part, input,
                         target, i + 1, curVal - cur, -cur);
                getExprUtil(res, curExp + "*" + part, input,
                         target, i + 1, curVal - last + last * cur,
                         last * cur);
            }
        }
    }
 
    // Below method returns all possible expression
    // evaluating to target
    function getExprs(input, target)
    {
        let res = [];
        getExprUtil(res, "", input, target, 0, 0, 0);
        return res;
    }
 
    // method to print result
    function printResult(res)
    {
        for (let i = 0; i < res.length; i++)
            document.write(res[i] + " ");
        document.write("</br>");
    }
     
    let input = "123";
    let target = 6;
    let res = getExprs(input, target);
    printResult(res);
  
    input = "125";
    target = 7;
    res = getExprs(input, target);
    printResult(res);
     
    // This code is contributed by decode2207.
</script>

                    

Output: 
 

1+2+3 1*2*3 
1*2+5 12-5

Time Complexity: O()
Auxiliary Space: O(N) 


 


Article Tags :