# Count all sub-strings with weight of characters atmost K

• Difficulty Level : Hard
• Last Updated : 07 Dec, 2021

Given a string P consisting of small English letters and a string Q consisting of weight of all characters of English alphabet such that for all ‘i’, 0 â‰¤ Q[i] â‰¤ 9. The task is to find the total numbers of unique substring with sum of weights atmost K.
Examples:

Input: P = “ababab”, Q = “12345678912345678912345678”, K = 5
Output:
Explanation:
The substrings with the sum of weights of individual characters â‰¤ 5 are:
“a”, “ab”, “b”, “bc”, “c”, “d”, “e”
Input: P = “acbacbacaa”, Q = “12300045600078900012345000”, K = 2
Output:
Explanation:
The substrings with the sum of weights of individual characters â‰¤ 2 are:
“a”, “b”, “aa”

Approach: The idea is to use an unordered set to store the unique values. The following steps are followed to compute the answer:

• Iterate over all the substrings using the nested loops and maintain the sum of the weight of all the characters encountered so far.
• If the sum of characters is not greater than K, then insert it in a hashmap.
• Finally, output the size of the hashmap.

Below is the implementation of the above approach:

## C++

 `// C++ program to find the count of` `// all the sub-strings with weight of` `// characters atmost K` `#include ` `using` `namespace` `std;`   `// Function to find the count of` `// all the substrings with weight` `// of characters atmost K` `int` `distinctSubstring(string& P, string& Q,` `                      ``int` `K, ``int` `N)` `{`   `    ``// Hashmap to store all substrings` `    ``unordered_set S;`   `    ``// Iterate over all substrings` `    ``for` `(``int` `i = 0; i < N; ++i) {`   `        ``// Maintain the sum of all characters` `        ``// encountered so far` `        ``int` `sum = 0;`   `        ``// Maintain the substring till the` `        ``// current position` `        ``string s;`   `        ``for` `(``int` `j = i; j < N; ++j) {`   `            ``// Get the position of the` `            ``// character in string Q` `            ``int` `pos = P[j] - ``'a'``;`   `            ``// Add weight to current sum` `            ``sum += Q[pos] - ``'0'``;`   `            ``// Add current character to substring` `            ``s += P[j];`   `            ``// If sum of characters is <=K` `            ``// then insert  into the set` `            ``if` `(sum <= K) {` `                ``S.insert(s);` `            ``}`   `            ``else` `{` `                ``break``;` `            ``}` `        ``}` `    ``}`   `    ``// Finding the size of the set` `    ``return` `S.size();` `}`   `// Driver code` `int` `main()` `{` `    ``string P = ``"abcde"``;` `    ``string Q = ``"12345678912345678912345678"``;` `    ``int` `K = 5;` `    ``int` `N = P.length();`   `    ``cout << distinctSubstring(P, Q, K, N);`   `    ``return` `0;` `}`

## Java

 `// Java program to find the count of` `// all the sub-Strings with weight of` `// characters atmost K` `import` `java.util.*;`   `class` `GFG{` ` `  `// Function to find the count of` `// all the subStrings with weight` `// of characters atmost K` `static` `int` `distinctSubString(String P, String Q,` `                      ``int` `K, ``int` `N)` `{` ` `  `    ``// Hashmap to store all subStrings` `    ``HashSet S = ``new` `HashSet();` ` `  `    ``// Iterate over all subStrings` `    ``for` `(``int` `i = ``0``; i < N; ++i) {` ` `  `        ``// Maintain the sum of all characters` `        ``// encountered so far` `        ``int` `sum = ``0``;` ` `  `        ``// Maintain the subString till the` `        ``// current position` `        ``String s = ``""``;` ` `  `        ``for` `(``int` `j = i; j < N; ++j) {` ` `  `            ``// Get the position of the` `            ``// character in String Q` `            ``int` `pos = P.charAt(j) - ``'a'``;` ` `  `            ``// Add weight to current sum` `            ``sum += Q.charAt(pos) - ``'0'``;` ` `  `            ``// Add current character to subString` `            ``s += P.charAt(j);` ` `  `            ``// If sum of characters is <=K` `            ``// then insert  into the set` `            ``if` `(sum <= K) {` `                ``S.add(s);` `            ``}` ` `  `            ``else` `{` `                ``break``;` `            ``}` `        ``}` `    ``}` ` `  `    ``// Finding the size of the set` `    ``return` `S.size();` `}` ` `  `// Driver code` `public` `static` `void` `main(String[] args)` `{` `    ``String P = ``"abcde"``;` `    ``String Q = ``"12345678912345678912345678"``;` `    ``int` `K = ``5``;` `    ``int` `N = P.length();` ` `  `    ``System.out.print(distinctSubString(P, Q, K, N));` `}` `}`   `// This code is contributed by Rajput-Ji`

## Python3

 `# Python program to find the count of ` `# all the sub-strings with weight of ` `# characters atmost K`   `# Function to find the count of ` `# all the substrings with weight ` `# of characters atmost K ` `def` `distinctSubstring(P, Q, K, N): `   `    ``# Hashmap to store all substrings ` `    ``S ``=` `set``()`   `    ``# Iterate over all substrings ` `    ``for` `i ``in` `range``(``0``,N): `   `        ``# Maintain the sum of all characters ` `        ``# encountered so far ` `        ``sum` `=` `0``; `   `        ``# Maintain the substring till the ` `        ``# current position ` `        ``s ``=` `''`   `        ``for` `j ``in` `range``(i,N):`   `            ``# Get the position of the ` `            ``# character in string Q ` `            ``pos ``=` `ord``(P[j]) ``-` `97`   `            ``# Add weight to current sum ` `            ``sum` `=` `sum` `+` `ord``(Q[pos]) ``-` `48`   `            ``# Add current character to substring ` `            ``s ``+``=` `P[j]`   `            ``# If sum of characters is <=K ` `            ``# then insert  into the set ` `            ``if` `(``sum` `<``=` `K):` `                ``S.add(s) ` `            ``else``:` `                ``break` `            `  `    ``# Finding the size of the set ` `    ``return` `len``(S)`   `# Driver code ` `P ``=` `"abcde"` `Q ``=` `"12345678912345678912345678"` `K ``=` `5` `N ``=` `len``(P)`   `print``(distinctSubstring(P, Q, K, N))`   `# This code is contributed by Sanjit_Prasad`

## C#

 `// C# program to find the count of` `// all the sub-Strings with weight of` `// characters atmost K` `using` `System;` `using` `System.Collections.Generic;`   `class` `GFG{` `  `  `// Function to find the count of` `// all the subStrings with weight` `// of characters atmost K` `static` `int` `distinctSubString(String P, String Q,` `                      ``int` `K, ``int` `N)` `{` `  `  `    ``// Hashmap to store all subStrings` `    ``HashSet S = ``new` `HashSet();` `  `  `    ``// Iterate over all subStrings` `    ``for` `(``int` `i = 0; i < N; ++i) {` `  `  `        ``// c the sum of all characters` `        ``// encountered so far` `        ``int` `sum = 0;` `  `  `        ``// Maintain the subString till the` `        ``// current position` `        ``String s = ``""``;` `  `  `        ``for` `(``int` `j = i; j < N; ++j) {` `  `  `            ``// Get the position of the` `            ``// character in String Q` `            ``int` `pos = P[j] - ``'a'``;` `  `  `            ``// Add weight to current sum` `            ``sum += Q[pos] - ``'0'``;` `  `  `            ``// Add current character to subString` `            ``s += P[j];` `  `  `            ``// If sum of characters is <=K` `            ``// then insert  into the set` `            ``if` `(sum <= K) {` `                ``S.Add(s);` `            ``}` `  `  `            ``else` `{` `                ``break``;` `            ``}` `        ``}` `    ``}` `  `  `    ``// Finding the size of the set` `    ``return` `S.Count;` `}` `  `  `// Driver code` `public` `static` `void` `Main(String[] args)` `{` `    ``String P = ``"abcde"``;` `    ``String Q = ``"12345678912345678912345678"``;` `    ``int` `K = 5;` `    ``int` `N = P.Length;` `  `  `    ``Console.Write(distinctSubString(P, Q, K, N));` `}` `}`   `// This code is contributed by 29AjayKumar`

## Javascript

 ``

Output:

`7`

Time Complexity: O(N2)

My Personal Notes arrow_drop_up
Related Articles