📜  表示数字的字符串的所有子字符串的总和 |设置 1

📅  最后修改于: 2021-09-17 07:40:03             🧑  作者: Mango

给定一个表示为字符串的整数,我们需要得到这个字符串所有可能子串的总和。
例子:

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

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

我们可以使用动态规划来解决这个问题。在这种情况下,我们可以根据它们结束的数字编写所有子字符串的总和,
所有子串的总和 = sumofdigit[0] + sumofdigit[1] + sumofdigit[2] … + sumofdigit[n-1] 其中 n 是字符串 的长度。
其中 sumofdigit[i] 存储以第 i 个索引数字结尾的所有子字符串的总和,在上面的示例中,

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

现在我们可以得到 sumofdigit 值之间的关系,并且可以迭代地解决问题。每个 sumofdigit 可以用以前的值表示,如下所示,

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]

使用上述关系,我们可以在线性时间内解决问题。在下面的代码中,一个完整的数组用于存储 sumofdigit,因为每个 sumofdigit 值只需要前一个值,我们也可以在不分配完整数组的情况下解决这个问题。

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 to test above methods
int main()
{
    string num = "1234";
    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 to test above methods
    public static void main(String[] args)
    {
        String num = "1234";
 
        System.out.println(sumOfSubstrings(num));
    }
}
// This code is contributed by Arnav Kr. Mandal.


Python3
# Python 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
num = "1234"
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";
 
        Console.Write(sumOfSubstrings(num));
    }
}
 
// This code is contributed by Nitin Mittal.


PHP


Javascript


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 to test above methods
int main()
{
    string num = "1234";
    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 to test above methods
public static void main(String[] args)
{
  String num = "1234";
  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
     
num = "1234"
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;
    }
 
  static void Main() {
    string num = "1234";
    Console.WriteLine(sumOfSubStrings(num));
  }
}
 
// This code is contributed by divyesh072019


Javascript


输出:

1670

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 to test above methods
int main()
{
    string num = "1234";
    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 to test above methods
public static void main(String[] args)
{
  String num = "1234";
  System.out.print(sumOfSubStrings(num) + "\n");
}
}
 
// This code is contributed by gauravrajput1

蟒蛇3

# 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
     
num = "1234"
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;
    }
 
  static void Main() {
    string num = "1234";
    Console.WriteLine(sumOfSubStrings(num));
  }
}
 
// This code is contributed by divyesh072019

Javascript


输出:
1670

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程