Open In App

Sum of all substrings of a string representing a number | Set 1

Given an integer represented as a string, we need to get the sum of all possible substrings of this string

Examples:

Input: num = “1234”
Output: 1670
Explanation: Sum = 1 + 2 + 3 + 4 + 12 + 23 +34 + 123 + 234 + 1234
= 1670

Input: num = “421”
Output: 491
Explanation: Sum = 4 + 2 + 1 + 42 + 21 + 421 = 491

Sum of all substrings of a string representing a number using Dynamic-Programming:

To solve the problem follow the below idea:

We can solve this problem by using dynamic programming. We can write a summation of all substrings on basis of the digit at which they are ending in that case,
Sum of all substrings = sumofdigit[0] + sumofdigit[1] + sumofdigit[2] … + sumofdigit[n-1] where n is length of string.
Where sumofdigit[i] stores the sum of all substring ending at ith index digit, in the above example,

Example: num = “1234”

sumofdigit[0] = 1 = 1
sumofdigit[1] = 2 + 12  = 14
sumofdigit[2] = 3 + 23  + 123 = 149
sumofdigit[3] = 4 + 34  + 234 + 1234  = 1506
Result = 1670

Now we can get the relation between sumofdigit values and can solve the question iteratively. Each sumofdigit can be represented in terms of previous value as shown below, For above example,

sumofdigit[3] = 4 + 34 + 234 + 1234
= 4 + 30 + 4 + 230 + 4 + 1230 + 4
= 4*4 + 10*(3 + 23 +123)
= 4*4 + 10*(sumofdigit[2])

In general, sumofdigit[i]  =  (i+1)*num[i] + 10*sumofdigit[i-1]

Follow the given steps to solve the problem:

• Declare an array of size n to store the sum of previous digits, processed so far, and a variable result
• Traverse over the string and for every character
• Set sumOfDigit[i] = (i + 1) * toDigit(num[i]) + 10 * sumOfDigit[i-1]
• Add the value of sumOfDigit[i] to result
• Return result

Below is the implementation of the above approach:

C++

 `// C++ program to print sum of all substring of``// a number represented as a string``#include ``using` `namespace` `std;` `// Utility method to convert character digit to``// integer digit``int` `toDigit(``char` `ch) { ``return` `(ch - ``'0'``); }` `// Returns sum of all substring of num``int` `sumOfSubstrings(string num)``{``    ``int` `n = num.length();` `    ``// allocate memory equal to length of string``    ``int` `sumofdigit[n];` `    ``// initialize first value with first digit``    ``sumofdigit[0] = toDigit(num[0]);``    ``int` `res = sumofdigit[0];` `    ``// loop over all digits of string``    ``for` `(``int` `i = 1; i < n; i++) {``        ``int` `numi = toDigit(num[i]);` `        ``// update each sumofdigit from previous value``        ``sumofdigit[i]``            ``= (i + 1) * numi + 10 * sumofdigit[i - 1];` `        ``// add current value to the result``        ``res += sumofdigit[i];``    ``}` `    ``return` `res;``}` `// Driver code``int` `main()``{``    ``string num = ``"1234"``;``  ` `      ``// Function call``    ``cout << sumOfSubstrings(num) << endl;``    ``return` `0;``}`

Java

 `// Java program to print sum of all substring of``// a number represented as a string``import` `java.util.Arrays;` `class` `GFG {` `    ``// Returns sum of all substring of num``    ``public` `static` `int` `sumOfSubstrings(String num)``    ``{``        ``int` `n = num.length();` `        ``// allocate memory equal to length of string``        ``int` `sumofdigit[] = ``new` `int``[n];` `        ``// initialize first value with first digit``        ``sumofdigit[``0``] = num.charAt(``0``) - ``'0'``;``        ``int` `res = sumofdigit[``0``];` `        ``// loop over all digits of string``        ``for` `(``int` `i = ``1``; i < n; i++) {``            ``int` `numi = num.charAt(i) - ``'0'``;` `            ``// update each sumofdigit from previous value``            ``sumofdigit[i]``                ``= (i + ``1``) * numi + ``10` `* sumofdigit[i - ``1``];` `            ``// add current value to the result``            ``res += sumofdigit[i];``        ``}` `        ``return` `res;``    ``}` `    ``// Driver code``    ``public` `static` `void` `main(String[] args)``    ``{``        ``String num = ``"1234"``;` `          ``// Function call``        ``System.out.println(sumOfSubstrings(num));``    ``}``}``// This code is contributed by Arnav Kr. Mandal.`

Python3

 `# Python3 program to print``# sum of all substring of``# a number represented as``# a string` `# Returns sum of all``# substring of num`  `def` `sumOfSubstrings(num):``    ``n ``=` `len``(num)` `    ``# allocate memory equal``    ``# to length of string``    ``sumofdigit ``=` `[]` `    ``# initialize first value``    ``# with first digit``    ``sumofdigit.append(``int``(num[``0``]))``    ``res ``=` `sumofdigit[``0``]` `    ``# loop over all``    ``# digits of string``    ``for` `i ``in` `range``(``1``, n):``        ``numi ``=` `int``(num[i])` `        ``# update each sumofdigit``        ``# from previous value``        ``sumofdigit.append((i ``+` `1``) ``*``                          ``numi ``+` `10` `*` `sumofdigit[i ``-` `1``])` `        ``# add current value``        ``# to the result``        ``res ``+``=` `sumofdigit[i]` `    ``return` `res`  `# Driver code``if` `__name__ ``=``=` `'__main__'``:``  ``num ``=` `"1234"` `  ``# Function call``  ``print``(sumOfSubstrings(num))` `# This code is contributed``# by Sanjit_Prasad`

C#

 `// C# program to print sum of``// all substring of a number``// represented as a string``using` `System;` `class` `GFG {` `    ``// Returns sum of all``    ``// substring of num``    ``public` `static` `int` `sumOfSubstrings(String num)``    ``{``        ``int` `n = num.Length;` `        ``// allocate memory equal to``        ``// length of string``        ``int``[] sumofdigit = ``new` `int``[n];` `        ``// initialize first value``        ``// with first digit``        ``sumofdigit[0] = num[0] - ``'0'``;``        ``int` `res = sumofdigit[0];` `        ``// loop over all digits``        ``// of string``        ``for` `(``int` `i = 1; i < n; i++) {``            ``int` `numi = num[i] - ``'0'``;` `            ``// update each sumofdigit``            ``// from previous value``            ``sumofdigit[i]``                ``= (i + 1) * numi + 10 * sumofdigit[i - 1];` `            ``// add current value``            ``// to the result``            ``res += sumofdigit[i];``        ``}` `        ``return` `res;``    ``}` `    ``// Driver code``    ``public` `static` `void` `Main()``    ``{``        ``String num = ``"1234"``;` `          ``// Function call``        ``Console.Write(sumOfSubstrings(num));``    ``}``}` `// This code is contributed by Nitin Mittal.`

PHP

 ``

Javascript

 ``

Output:

`1670`

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

Sum of all substrings of a string representing a number using constant Space:

To solve the problem follow the below idea:

The approach is the same as described above. What we have observed is that at the current index we are dependent on the current sum + previous index sum so instead of storing it in an array we can store it in two variables current and prev

Below is the implementation of the above approach:

C++14

 `// C++ program to print sum of all substring of``// a number represented as a string``#include ``using` `namespace` `std;` `// Utility method to convert character digit to``// integer digit``int` `toDigit(``char` `ch) { ``return` `(ch - ``'0'``); }` `// Returns sum of all substring of num``int` `sumOfSubstrings(string num)``{``    ``int` `n = num.length();` `    ``// storing prev value``    ``int` `prev = toDigit(num[0]);` `    ``int` `res = prev; ``// ans` `    ``int` `current = 0;` `    ``// substrings sum upto current index``    ``// loop over all digits of string``    ``for` `(``int` `i = 1; i < n; i++) {``        ``int` `numi = toDigit(num[i]);` `        ``// update each sumofdigit from previous value``        ``current = (i + 1) * numi + 10 * prev;` `        ``// add current value to the result``        ``res += current;``        ``prev = current; ``// update previous``    ``}` `    ``return` `res;``}` `// Driver code``int` `main()``{``    ``string num = ``"1234"``;``  ` `      ``// Function call``    ``cout << sumOfSubstrings(num) << endl;``    ``return` `0;``}`

Java

 `// Java program to print``// sum of all subString of``// a number represented as a String``import` `java.util.*;``class` `GFG {` `    ``// Utility method to``    ``// convert character``    ``// digit to integer digit``    ``static` `int` `toDigit(``char` `ch) { ``return` `(ch - ``'0'``); }` `    ``// Returns sum of all subString of num``    ``static` `int` `sumOfSubStrings(String num)``    ``{``        ``int` `n = num.length();` `        ``// Storing prev value``        ``int` `prev = toDigit(num.charAt(``0``));` `        ``int` `res = prev;` `        ``int` `current = ``0``;` `        ``// SubStrings sum upto current index``        ``// loop over all digits of String``        ``for` `(``int` `i = ``1``; i < n; i++) {``            ``int` `numi = toDigit(num.charAt(i));` `            ``// Update each sumofdigit``            ``// from previous value``            ``current = (i + ``1``) * numi + ``10` `* prev;` `            ``// Add current value to the result``            ``res += current;` `            ``// Update previous``            ``prev = current;``        ``}``        ``return` `res;``    ``}` `    ``// Driver code``    ``public` `static` `void` `main(String[] args)``    ``{``        ``String num = ``"1234"``;``      ` `          ``// Function call``        ``System.out.print(sumOfSubStrings(num) + ``"\n"``);``    ``}``}` `// This code is contributed by gauravrajput1`

Python3

 `# Python3 program to print sum of all substring of``# a number represented as a string` `# Returns sum of all substring of num`  `def` `sumOfSubstrings(num):` `    ``n ``=` `len``(num)` `    ``# storing prev value``    ``prev ``=` `int``(num[``0``])` `    ``res ``=` `prev  ``# ans` `    ``current ``=` `0` `    ``# substrings sum upto current index``    ``# loop over all digits of string``    ``for` `i ``in` `range``(``1``, n):``        ``numi ``=` `int``(num[i])` `        ``# update each sumofdigit from previous value``        ``current ``=` `(i ``+` `1``) ``*` `numi ``+` `10` `*` `prev` `        ``# add current value to the result``        ``res ``+``=` `current``        ``prev ``=` `current  ``# update previous` `    ``return` `res` `# Driver code``if` `__name__ ``=``=` `'__main__'``:``  ``num ``=` `"1234"` `  ``# Function call``  ``print``(sumOfSubstrings(num))` `# This code is contributed by divyeshrabadiya07`

C#

 `// C# program to print sum of all substring of``// a number represented as a string``using` `System;``class` `GFG {` `    ``// Utility method to``    ``// convert character``    ``// digit to integer digit``    ``static` `int` `toDigit(``char` `ch) { ``return` `(ch - ``'0'``); }` `    ``// Returns sum of all subString of num``    ``static` `int` `sumOfSubStrings(``string` `num)``    ``{``        ``int` `n = num.Length;` `        ``// Storing prev value``        ``int` `prev = toDigit(num[0]);` `        ``int` `res = prev;` `        ``int` `current = 0;` `        ``// SubStrings sum upto current index``        ``// loop over all digits of String``        ``for` `(``int` `i = 1; i < n; i++) {``            ``int` `numi = toDigit(num[i]);` `            ``// Update each sumofdigit``            ``// from previous value``            ``current = (i + 1) * numi + 10 * prev;` `            ``// Add current value to the result``            ``res += current;` `            ``// Update previous``            ``prev = current;``        ``}``        ``return` `res;``    ``}` `      ``// Driver code``    ``static` `void` `Main()``    ``{``        ``string` `num = ``"1234"``;``      ` `          ``// Function call``        ``Console.WriteLine(sumOfSubStrings(num));``    ``}``}` `// This code is contributed by divyesh072019`

Javascript

 ``

Output:

`1670`

Time complexity: O(N)
Auxiliary Space: O(1)

This article is contributed by Utkarsh Trivedi. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks