给定由N个整数组成的数字字符串str ,任务是在除去非空子字符串之后找到所有可能的结果字符串的总和。
例子:
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.
方法:要解决此问题,需要进行以下观察:
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
请按照以下步骤解决问题:
- 预计算10的幂并存储在一个数组中powers [] 。
- 将给定数字字符串的数字的前缀和存储在数组pref []中。
- 应用上面获得的公式,对于从0到N – 1的每个x ,计算总和。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
const int N = 10;
int pref[N], power[N];
// Function to convert a character
// to its equivalent digit
int toDigit(char ch)
{
return (ch - '0');
}
// Function to precompute powers of 10
void powerOf10()
{
power[0] = 1;
for (int i = 1; i < N; i++)
power[i] = power[i - 1] * 10;
}
// Function to precompute prefix sum
// of numerical strings
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]);
}
// Function to return the i-th
// term of Triangular Number
int triangularNumber(int i)
{
int res = i * (i + 1) / 2;
return res;
}
// Function to return the sum
// of all resulting strings
int sumOfSubstrings(string str)
{
int n = str.size();
// Precompute powers of 10
powerOf10();
// Precompute prefix sum
precomputePrefix(str, n);
// Initialize result
int ans = 0;
for (int i = 0; i < n - 1; i++) {
// Apply the above general
// formula for every i
ans += (pref[n - i - 2] * (i + 1)
+ toDigit(str[n - i - 1])
* triangularNumber(
n - i - 1))
* power[i];
}
// Return the answer
return ans;
}
// Driver Code
int main()
{
string str = "1234";
// Function Call
cout << sumOfSubstrings(str);
return 0;
}
Java
// Java program for the
// above approach
import java.util.*;
class GFG{
static int N = 10;
static int []pref = new int[N];
static int[] power = new int[N];
// Function to convert a
// character to its equivalent
// digit
static int toDigit(char ch)
{
return (ch - '0');
}
// Function to precompute
// powers of 10
static void powerOf10()
{
power[0] = 1;
for (int i = 1; i < N; i++)
power[i] = power[i - 1] * 10;
}
// Function to precompute prefix sum
// of numerical Strings
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]);
}
// Function to return the i-th
// term of Triangular Number
static int triangularNumber(int i)
{
int res = i * (i + 1) / 2;
return res;
}
// Function to return the sum
// of all resulting Strings
static int sumOfSubStrings(String str)
{
int n = str.length();
// Precompute powers of 10
powerOf10();
// Precompute prefix sum
precomputePrefix(
str.toCharArray(), n);
// Initialize result
int ans = 0;
for (int i = 0; i < n - 1; i++)
{
// Apply the above general
// formula for every i
ans += (pref[n - i - 2] * (i + 1) +
toDigit(str.charAt(n - i - 1)) *
triangularNumber(n - i - 1)) *
power[i];
}
// Return the answer
return ans;
}
// Driver Code
public static void main(String[] args)
{
String str = "1234";
// Function Call
System.out.print(sumOfSubStrings(str));
}
}
// This code is contributed by 29AjayKumar
Python3
# Python 3 program for the
# above approach
N = 10
pref = [0] * N
power = [0] * N
# Function to convert a
# character to its equivalent
# digit
def toDigit(ch):
return (ord(ch) -
ord('0'))
# Function to precompute
# powers of 10
def powerOf10():
power[0] = 1
for i in range(1, N):
power[i] = power[i - 1] * 10
# Function to precompute prefix sum
# of numerical strings
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]))
# Function to return the i-th
# term of Triangular Number
def triangularNumber(i):
res = i * (i + 1) // 2
return res
# Function to return the sum
# of all resulting strings
def sumOfSubstrings(st):
n = len(st)
# Precompute powers
# of 10
powerOf10()
# Precompute prefix
# sum
precomputePrefix(st, n)
# Initialize result
ans = 0
for i in range(n - 1):
# Apply the above general
# formula for every i
ans += ((pref[n - i - 2] * (i + 1) +
toDigit(st[n - i - 1]) *
triangularNumber(n - i - 1)) *
power[i])
# Return the answer
return ans
# Driver Code
if __name__ == "__main__":
st = "1234"
# Function Call
print(sumOfSubstrings(st))
# This code is contributed by Chitranayal
C#
// C# program for the
// above approach
using System;
class GFG{
static int N = 10;
static int []pref = new int[N];
static int[] power = new int[N];
// Function to convert a
// character to its equivalent
// digit
static int toDigit(char ch)
{
return (ch - '0');
}
// Function to precompute
// powers of 10
static void powerOf10()
{
power[0] = 1;
for (int i = 1; i < N; i++)
power[i] = power[i - 1] * 10;
}
// Function to precompute prefix sum
// of numerical Strings
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]);
}
// Function to return the i-th
// term of Triangular Number
static int triangularNumber(int i)
{
int res = i * (i + 1) / 2;
return res;
}
// Function to return the sum
// of all resulting Strings
static int sumOfSubStrings(String str)
{
int n = str.Length;
// Precompute powers of 10
powerOf10();
// Precompute prefix sum
precomputePrefix(str.ToCharArray(), n);
// Initialize result
int ans = 0;
for (int i = 0; i < n - 1; i++)
{
// Apply the above general
// formula for every i
ans += (pref[n - i - 2] * (i + 1) +
toDigit(str[n - i - 1]) *
triangularNumber(n - i - 1)) *
power[i];
}
// Return the answer
return ans;
}
// Driver Code
public static void Main(String[] args)
{
String str = "1234";
// Function Call
Console.Write(sumOfSubStrings(str));
}
}
// This code is contributed by 29AjayKumar
680
时间复杂度: O(N),其中N是字符串的长度。
辅助空间: O(1)