Saturday, December 28, 2024
Google search engine
HomeLanguagesDynamic ProgrammingSum of all substrings of a string representing a number | Set...

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 <bits/stdc++.h>
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




<?php
// PHP program to print sum of all
// substring of a number represented
// as a string
 
// Method to convert character
// digit to integer digit
function toDigit($ch)
{
    return ($ch - '0');
}
 
// Returns sum of all
// substring of num
function sumOfSubstrings($num)
{
    $n = strlen($num);
 
    // allocate memory equal to
    // length of string
    $sumofdigit[$n] = 0;
 
    // initialize first value
    // with first digit
    $sumofdigit[0] = toDigit($num[0]);
    $res = $sumofdigit[0];
 
    // loop over all digits of string
    for($i = 1; $i < $n; $i++)
    {
        $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
    $num = "1234";
 
    // Function call
    echo sumOfSubstrings($num) ;
     
// This code is contributed by nitin mittal.
?>


Javascript




<script>
 
    // Javascript program to print sum of
    // all substring of a number
    // represented as a string
     
    // Returns sum of all
    // substring of num
    function sumOfSubstrings(num)
    {
        let n = num.length;
  
        // allocate memory equal to
        // length of string
        let sumofdigit = new Array(n);
  
        // initialize first value
        // with first digit
        sumofdigit[0] = num[0].charCodeAt() - '0'.charCodeAt();
        let res = sumofdigit[0];
  
        // loop over all digits
        // of string
        for (let i = 1; i < n; i++) {
            let numi = num[i].charCodeAt() - '0'.charCodeAt();
  
            // 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;
    }
     
    let num = "1234";
  
      document.write(sumOfSubstrings(num));
     
</script>


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 <bits/stdc++.h>
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




<script>
 
// JavaScript program to print
// sum of all subString of
// a number represented as a String
 
// Utility method to
// convert character
// digit to integer digit
function toDigit(ch)
{
  return (ch - '0');
}
 
// Returns sum of all subString of num
function sumOfSubStrings(num)
{
  let n = num.length;
 
  // Storing prev value
  let prev = toDigit(num[0]);
 
  let res = prev;
 
  let current = 0;
 
  // SubStrings sum upto current index
  // loop over all digits of String
  for (let i = 1; i < n; i++)
  {
    let 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
 
        let num = "1234";
  document.write(sumOfSubStrings(num) + "\n");
 
</script>


Output: 

1670

 

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

Related Article: Sum of all substrings of a string representing a number | Set 2 (Constant Extra Space)

This article is contributed by Utkarsh Trivedi. If you like neveropen 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 neveropen main page and help other Geeks

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

RELATED ARTICLES

Most Popular

Recent Comments