给定一个表示为字符串的整数,我们需要得到这个字符串所有可能子串的总和。
例子:
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 现场工作专业课程和学生竞争性编程现场课程。