Sum of all possible strings obtained by removal of non-empty substrings

Given numerical string str consisting of N integers, the task is to find the sum of all possible resulting strings after removing non-empty substrings.

Examples:

Input: str = β€œ205”
Output: 57
Explanation: Substrings that can be removed are β€œ2”, β€œ0”, β€œ5”, β€œ20”, β€œ05”, β€œ205”. The resultant strings are β€œ05”, β€œ25”, β€œ20”, β€œ5”, β€œ2”, β€œ0” respectively. Therefore, the sum will be 57.

Input: str = β€œ1234”
Output: 680
Explanation: Substrings that can be removed are β€œ1”, β€œ2”, β€œ3”, β€œ4”, β€œ12”, β€œ23”, β€œ34”, β€œ123”, β€œ234”, β€œ1234”. The resultant strings are β€œ234”, β€œ134”, β€œ124”, β€œ123”, β€œ34”, β€œ14”, β€œ12”, β€œ4”, β€œ1”, β€œ0” respectively. Therefore, the sum will be 680.

Approach: To solve the problem, the following observations need to be made:

Illustration: 
Let str = β€œ1234” 
All strings possible by removal of non-empty substrings and position of each character in these strings are as follows:

  100 10 1
234 2 3 4
134 1 3 4
124 1 2 4
123 1 2 3
34   3 4
14   1 4
12   1 2
4     4
1     1
0     0

From the above table, get the contribution at every index, for exampleContribution at 1 -> ((1 + 2 + 3) * 1 + 4 * 6) * 1

Contribution at 10 -> ((1 + 2) * 2 + 3 * 3) * 10

Contribution at 100 -> ((1) * 3 + 2 * 1) * 100

Thus, generate a general formula for every index, i.e

Contribution at 10x = (?(n – x – 2) * (x + 1) + str[n – x – 1] * (n – x – 1)th term of Triangular Number) * 10x

Follow the steps below to solve the problem:  

  • Pre-compute powers of 10 and store in an array powers[].
  • Store the prefix sum of the digits of the given numerical string in array pref[].
  • Applying the above formula obtained, for every x from 0 to N – 1, calculate the sum.

Below is the implementation of the above approach:

C++




// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
const int N = 10;
 
int pref[N], power[N];
 
// Function to convert a character
// to its equivalent digit
int toDigit(char ch)
{
    return (ch - '0');
}
 
// Function to precompute powers of 10
void powerOf10()
{
    power[0] = 1;
    for (int i = 1; i < N; i++)
        power[i] = power[i - 1] * 10;
}
 
// Function to precompute prefix sum
// of numerical strings
void precomputePrefix(string str, int n)
{
    pref[0] = str[0] - '0';
    for (int i = 1; i < n; i++)
        pref[i] = pref[i - 1]
                  + toDigit(str[i]);
}
 
// Function to return the i-th
// term of Triangular Number
int triangularNumber(int i)
{
    int res = i * (i + 1) / 2;
    return res;
}
 
// Function to return the sum
// of all resulting strings
int sumOfSubstrings(string str)
{
    int n = str.size();
 
    // Precompute powers of 10
    powerOf10();
 
    // Precompute prefix sum
    precomputePrefix(str, n);
 
    // Initialize result
    int ans = 0;
 
    for (int i = 0; i < n - 1; i++) {
 
        // Apply the above general
        // formula for every i
        ans += (pref[n - i - 2] * (i + 1)
                + toDigit(str[n - i - 1])
                      * triangularNumber(
                            n - i - 1))
               * power[i];
    }
 
    // Return the answer
    return ans;
}
 
// Driver Code
int main()
{
    string str = "1234";
 
    // Function Call
    cout << sumOfSubstrings(str);
 
    return 0;
}


Java




// Java program for the
// above approach
import java.util.*;
class GFG{
 
static int N = 10;
static int []pref = new int[N];
static int[] power = new int[N];
 
// Function to convert a
// character to its equivalent
// digit
static int toDigit(char ch)
{
  return (ch - '0');
}
 
// Function to precompute
// powers of 10
static void powerOf10()
{
  power[0] = 1;
   
  for (int i = 1; i < N; i++)
    power[i] = power[i - 1] * 10;
}
 
// Function to precompute prefix sum
// of numerical Strings
static void precomputePrefix(char[] str,
                             int n)
{
  pref[0] = str[0] - '0';
   
  for (int i = 1; i < n; i++)
    pref[i] = pref[i - 1] +
              toDigit(str[i]);
}
 
// Function to return the i-th
// term of Triangular Number
static int triangularNumber(int i)
{
  int res = i * (i + 1) / 2;
  return res;
}
 
// Function to return the sum
// of all resulting Strings
static int sumOfSubStrings(String str)
{
  int n = str.length();
 
  // Precompute powers of 10
  powerOf10();
 
  // Precompute prefix sum
  precomputePrefix(
  str.toCharArray(), n);
 
  // Initialize result
  int ans = 0;
 
  for (int i = 0; i < n - 1; i++)
  {
    // Apply the above general
    // formula for every i
    ans += (pref[n - i - 2] * (i + 1) +
            toDigit(str.charAt(n - i - 1)) *
            triangularNumber(n - i - 1)) *
            power[i];
  }
 
  // Return the answer
  return ans;
}
 
// Driver Code
public static void main(String[] args)
{
  String str = "1234";
 
  // Function Call
  System.out.print(sumOfSubStrings(str));
}
}
 
// This code is contributed by 29AjayKumar


Python3




# Python 3 program for the
# above approach
N = 10
pref = [0] * N
power = [0] * N
 
# Function to convert a
# character to its equivalent
# digit
def toDigit(ch):
   
    return (ord(ch) -
            ord('0'))
 
# Function to precompute
# powers of 10
def powerOf10():
 
    power[0] = 1
    for i in range(1, N):
        power[i] = power[i - 1] * 10
 
# Function to precompute prefix sum
# of numerical strings
def precomputePrefix(st, n):
 
    pref[0] = (ord(st[0]) -
               ord('0'))
    for i in range(1, n):
        pref[i] = (pref[i - 1] +
                   toDigit(st[i]))
 
# Function to return the i-th
# term of Triangular Number
def triangularNumber(i):
 
    res = i * (i + 1) // 2
    return res
 
# Function to return the sum
# of all resulting strings
def sumOfSubstrings(st):
 
    n = len(st)
 
    # Precompute powers
    # of 10
    powerOf10()
 
    # Precompute prefix
    # sum
    precomputePrefix(st, n)
 
    # Initialize result
    ans = 0
 
    for i in range(n - 1):
 
        # Apply the above general
        # formula for every i
        ans += ((pref[n - i - 2] * (i + 1) +
                 toDigit(st[n - i - 1]) *
                 triangularNumber(n - i - 1)) *
                 power[i])
 
    # Return the answer
    return ans
 
# Driver Code
if __name__ == "__main__":
 
    st = "1234"
 
    # Function Call
    print(sumOfSubstrings(st))
 
# This code is contributed by Chitranayal


C#




// C# program for the
// above approach
using System;
class GFG{
 
static int N = 10;
static int []pref = new int[N];
static int[] power = new int[N];
 
// Function to convert a
// character to its equivalent
// digit
static int toDigit(char ch)
{
  return (ch - '0');
}
 
// Function to precompute
// powers of 10
static void powerOf10()
{
  power[0] = 1;
   
  for (int i = 1; i < N; i++)
    power[i] = power[i - 1] * 10;
}
 
// Function to precompute prefix sum
// of numerical Strings
static void precomputePrefix(char[] str,
                             int n)
{
  pref[0] = str[0] - '0';
   
  for (int i = 1; i < n; i++)
    pref[i] = pref[i - 1] +
              toDigit(str[i]);
}
 
// Function to return the i-th
// term of Triangular Number
static int triangularNumber(int i)
{
  int res = i * (i + 1) / 2;
  return res;
}
 
// Function to return the sum
// of all resulting Strings
static int sumOfSubStrings(String str)
{
  int n = str.Length;
 
  // Precompute powers of 10
  powerOf10();
 
  // Precompute prefix sum
  precomputePrefix(str.ToCharArray(), n);
 
  // Initialize result
  int ans = 0;
 
  for (int i = 0; i < n - 1; i++)
  {
    // Apply the above general
    // formula for every i
    ans += (pref[n - i - 2] * (i + 1) +
            toDigit(str[n - i - 1]) *
            triangularNumber(n - i - 1)) *
            power[i];
  }
 
  // Return the answer
  return ans;
}
 
// Driver Code
public static void Main(String[] args)
{
  String str = "1234";
 
  // Function Call
  Console.Write(sumOfSubStrings(str));
}
}
 
// This code is contributed by 29AjayKumar


Javascript




<script>
 
      // JavaScript program for the
      // above approach
      var N = 10;
      var pref = new Array(N).fill(0);
      var power = new Array(N).fill(0);
 
      // Function to convert a
      // character to its equivalent
      // digit
      function toDigit(ch) {
        return ch - "0";
      }
 
      // Function to precompute
      // powers of 10
      function powerOf10() {
        power[0] = 1;
 
        for (var i = 1; i < N; i++)
        power[i] = power[i - 1] * 10;
      }
 
      // Function to precompute prefix sum
      // of numerical Strings
      function precomputePrefix(str, n) {
        pref[0] = str[0] - "0";
 
        for (var i = 1; i < n; i++)
        pref[i] = pref[i - 1] + toDigit(str[i]);
      }
 
      // Function to return the i-th
      // term of Triangular Number
      function triangularNumber(i) {
        var res = parseInt((i * (i + 1)) / 2);
        return res;
      }
 
      // Function to return the sum
      // of all resulting Strings
      function sumOfSubStrings(str) {
        var n = str.length;
 
        // Precompute powers of 10
        powerOf10();
 
        // Precompute prefix sum
        precomputePrefix(str.split(""), n);
 
        // Initialize result
        var ans = 0;
 
        for (var i = 0; i < n - 1; i++) {
          // Apply the above general
          // formula for every i
          ans +=
            (pref[n - i - 2] * (i + 1) +
              toDigit(str[n - i - 1]) *
              triangularNumber(n - i - 1)) *
              power[i];
        }
 
        // Return the answer
        return ans;
      }
 
      // Driver Code
      var str = "1234";
 
      // Function Call
      document.write(sumOfSubStrings(str));
       
</script>


Output: 

680

 

Time Complexity: O(N), where N is the length of the string. 
Auxiliary Space: O(1)



Contact Us