Given string str that contains only digits, the task is to return an expression by inserting the ‘+’ or ‘*’ operator between every two digits such that the arithmetic value of the expression is minimized.
Example:
Input: str = “322”
Output: “3+2*2”
Explanation: The value of above expression is 7 which is minimum possible over the other expressions “3+2+2”, “3*2+2”, “3*3*2”Input: str = “391118571”
Output: “3+9*1*1*1+8+5+7*1”
Approach: The given problem can be solved using a greedy approach. Follow the steps below to solve the problem:
- If the string str contains character ‘0’ then:
- Insert multiplication operator between every character of the string
- Else create a string ans to store the iterate the string and if the current character str[i] is:
- ‘1’, then Insert multiplication operator ‘*’ between the current and previous character
- not ‘1’ then Insert addition operator ‘+’ between the current and previous character
Below is the implementation of the above approach:
// C++ implementation for the above approach #include <bits/stdc++.h> using namespace std;
string minimalExpression(string str) { // Initialize an empty string
// to store the answer
string ans = "" ;
ans.push_back(str[0]);
bool iszero = false ;
// Check if zero is present in the
// string
for ( int i = 0; i < str.size();
i++) {
if (str[i] == '0' ) {
iszero = true ;
}
}
// Insert all multiplication operators
// between every digit of the string
if (iszero) {
for ( int i = 1; i < str.size();
i++) {
ans.push_back( '*' );
ans.push_back(str[i]);
}
return ans;
}
// Else calculate minimum expression
// with combination of '*' and '+'
// operators between digits
for ( int i = 1; i < str.size(); i++) {
// If current character is '1' insert
// multiplication operator between
// current and previous character
if (str[i] == '1' ) {
ans.push_back( '*' );
ans.push_back(str[i]);
}
// Else insert addition operator
// between current and
// previous character
else {
ans.push_back( '+' );
ans.push_back(str[i]);
}
}
// Return the result
return ans;
} // Driver Code int main()
{ string str = "391118571" ;
cout << minimalExpression(str);
} |
// Java implementation for the above approach class GFG {
public static String minimalExpression(String str) {
// Initialize an empty String
// to store the answer
String ans = "" ;
ans = ans + str.charAt( 0 );
boolean iszero = false ;
// Check if zero is present in the
// String
for ( int i = 0 ; i < str.length(); i++) {
if (str.charAt(i) == '0' ) {
iszero = true ;
}
}
// Insert all multiplication operators
// between every digit of the String
if (iszero) {
for ( int i = 1 ; i < str.length(); i++) {
ans += '*' ;
ans += str.charAt(i);
}
return ans;
}
// Else calculate minimum expression
// with combination of '*' and '+'
// operators between digits
for ( int i = 1 ; i < str.length(); i++) {
// If current character is '1' insert
// multiplication operator between
// current and previous character
if (str.charAt(i) == '1' ) {
ans += '*' ;
ans += str.charAt(i);
}
// Else insert addition operator
// between current and
// previous character
else {
ans += '+' ;
ans += str.charAt(i);
}
}
// Return the result
return ans;
}
// Driver Code
public static void main(String args[]) {
String str = "391118571" ;
System.out.println(minimalExpression(str));
}
} // This code is contributed by saurabh_jaiswal. |
# python implementation for the above approach def minimalExpression( str ):
# Initialize an empty string
# to store the answer
ans = ""
ans + = str [ 0 ]
iszero = False
# Check if zero is present in the
# string
for i in range ( 0 , len ( str )):
if ( str [i] = = '0' ):
iszero = True
# Insert all multiplication operators
# between every digit of the string
if (iszero):
for i in range ( 1 , len ( str )):
ans + = '*'
ans + = str [i]
return ans
# Else calculate minimum expression
# with combination of '*' and '+'
# operators between digits
for i in range ( 1 , len ( str )):
# If current character is '1' insert
# multiplication operator between
# current and previous character
if ( str [i] = = '1' ):
ans + = '*'
ans + = str [i]
# Else insert addition operator
# between current and
# previous character
else :
ans + = '+'
ans + = str [i]
# Return the result
return ans
# Driver Code if __name__ = = "__main__" :
str = "391118571"
print (minimalExpression( str ))
# This code is contributed by rakeshsahni |
// C# implementation for the above approach using System;
class GFG {
static string minimalExpression( string str)
{
// Initialize an empty string
// to store the answer
string ans = "" ;
ans += str[0];
bool iszero = false ;
// Check if zero is present in the
// string
for ( int i = 0; i < str.Length; i++) {
if (str[i] == '0' ) {
iszero = true ;
}
}
// Insert all multiplication operators
// between every digit of the string
if (iszero) {
for ( int i = 1; i < str.Length; i++) {
ans += '*' ;
ans += (str[i]);
}
return ans;
}
// Else calculate minimum expression
// with combination of '*' and '+'
// operators between digits
for ( int i = 1; i < str.Length; i++) {
// If current character is '1' insert
// multiplication operator between
// current and previous character
if (str[i] == '1' ) {
ans += '*' ;
ans += (str[i]);
}
// Else insert addition operator
// between current and
// previous character
else {
ans += '+' ;
ans += (str[i]);
}
}
// Return the result
return ans;
}
// Driver Code
public static void Main()
{
string str = "391118571" ;
Console.WriteLine(minimalExpression(str));
}
} // This code is contributed by ukasp. |
<script> // Javascript implementation for the above approach function minimalExpression(str) {
// Initialize an empty string
// to store the answer
let ans = [];
ans.push(str[0]);
let iszero = false ;
// Check if zero is present in the
// string
for (let i = 0; i < str.length; i++) {
if (str[i] == "0" ) {
iszero = true ;
}
}
// Insert all multiplication operators
// between every digit of the string
if (iszero) {
for (let i = 1; i < str.length; i++) {
ans.push( "*" );
ans.push(str[i]);
}
return ans;
}
// Else calculate minimum expression
// with combination of '*' and '+'
// operators between digits
for (let i = 1; i < str.length; i++) {
// If current character is '1' insert
// multiplication operator between
// current and previous character
if (str[i] == "1" ) {
ans.push( "*" );
ans.push(str[i]);
}
// Else insert addition operator
// between current and
// previous character
else {
ans.push( "+" );
ans.push(str[i]);
}
}
// Return the result
return ans.join( "" );
} // Driver Code let str = "391118571" ;
document.write(minimalExpression(str)); // This code is contributed by saurabh_jaiswal. </script> |
3+9*1*1*1+8+5+7*1
Time Complexity: O(N)
Auxiliary Space: O(N), where N is the length of the given string