Sum of all possible strings obtained by removal of non-empty substrings
Last Updated :
26 May, 2021
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++
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
int pref[N], power[N];
int toDigit( char ch)
{
return (ch - '0' );
}
void powerOf10()
{
power[0] = 1;
for ( int i = 1; i < N; i++)
power[i] = power[i - 1] * 10;
}
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]);
}
int triangularNumber( int i)
{
int res = i * (i + 1) / 2;
return res;
}
int sumOfSubstrings(string str)
{
int n = str.size();
powerOf10();
precomputePrefix(str, n);
int ans = 0;
for ( int i = 0; i < n - 1; i++) {
ans += (pref[n - i - 2] * (i + 1)
+ toDigit(str[n - i - 1])
* triangularNumber(
n - i - 1))
* power[i];
}
return ans;
}
int main()
{
string str = "1234" ;
cout << sumOfSubstrings(str);
return 0;
}
|
Java
import java.util.*;
class GFG{
static int N = 10 ;
static int []pref = new int [N];
static int [] power = new int [N];
static int toDigit( char ch)
{
return (ch - '0' );
}
static void powerOf10()
{
power[ 0 ] = 1 ;
for ( int i = 1 ; i < N; i++)
power[i] = power[i - 1 ] * 10 ;
}
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]);
}
static int triangularNumber( int i)
{
int res = i * (i + 1 ) / 2 ;
return res;
}
static int sumOfSubStrings(String str)
{
int n = str.length();
powerOf10();
precomputePrefix(
str.toCharArray(), n);
int ans = 0 ;
for ( int i = 0 ; i < n - 1 ; i++)
{
ans += (pref[n - i - 2 ] * (i + 1 ) +
toDigit(str.charAt(n - i - 1 )) *
triangularNumber(n - i - 1 )) *
power[i];
}
return ans;
}
public static void main(String[] args)
{
String str = "1234" ;
System.out.print(sumOfSubStrings(str));
}
}
|
Python3
N = 10
pref = [ 0 ] * N
power = [ 0 ] * N
def toDigit(ch):
return ( ord (ch) -
ord ( '0' ))
def powerOf10():
power[ 0 ] = 1
for i in range ( 1 , N):
power[i] = power[i - 1 ] * 10
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]))
def triangularNumber(i):
res = i * (i + 1 ) / / 2
return res
def sumOfSubstrings(st):
n = len (st)
powerOf10()
precomputePrefix(st, n)
ans = 0
for i in range (n - 1 ):
ans + = ((pref[n - i - 2 ] * (i + 1 ) +
toDigit(st[n - i - 1 ]) *
triangularNumber(n - i - 1 )) *
power[i])
return ans
if __name__ = = "__main__" :
st = "1234"
print (sumOfSubstrings(st))
|
C#
using System;
class GFG{
static int N = 10;
static int []pref = new int [N];
static int [] power = new int [N];
static int toDigit( char ch)
{
return (ch - '0' );
}
static void powerOf10()
{
power[0] = 1;
for ( int i = 1; i < N; i++)
power[i] = power[i - 1] * 10;
}
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]);
}
static int triangularNumber( int i)
{
int res = i * (i + 1) / 2;
return res;
}
static int sumOfSubStrings(String str)
{
int n = str.Length;
powerOf10();
precomputePrefix(str.ToCharArray(), n);
int ans = 0;
for ( int i = 0; i < n - 1; i++)
{
ans += (pref[n - i - 2] * (i + 1) +
toDigit(str[n - i - 1]) *
triangularNumber(n - i - 1)) *
power[i];
}
return ans;
}
public static void Main(String[] args)
{
String str = "1234" ;
Console.Write(sumOfSubStrings(str));
}
}
|
Javascript
<script>
var N = 10;
var pref = new Array(N).fill(0);
var power = new Array(N).fill(0);
function toDigit(ch) {
return ch - "0" ;
}
function powerOf10() {
power[0] = 1;
for ( var i = 1; i < N; i++)
power[i] = power[i - 1] * 10;
}
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 triangularNumber(i) {
var res = parseInt((i * (i + 1)) / 2);
return res;
}
function sumOfSubStrings(str) {
var n = str.length;
powerOf10();
precomputePrefix(str.split( "" ), n);
var ans = 0;
for ( var i = 0; i < n - 1; i++) {
ans +=
(pref[n - i - 2] * (i + 1) +
toDigit(str[n - i - 1]) *
triangularNumber(n - i - 1)) *
power[i];
}
return ans;
}
var str = "1234" ;
document.write(sumOfSubStrings(str));
</script>
|
Time Complexity: O(N), where N is the length of the string.
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...