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

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: 7 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: 3 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++
Java
Python3
C#
Javascript
// C++ program to find the count of// all the sub-strings with weight of// characters atmost K#include <bits/stdc++.h>using namespace std; // Function to find the count of// all the substrings with weight// of characters atmost Kint distinctSubstring(string& P, string& Q,                      int K, int N){     // Hashmap to store all substrings    unordered_set<string> 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 codeint main(){    string P = "abcde";    string Q = "12345678912345678912345678";    int K = 5;    int N = P.length();     cout << distinctSubstring(P, Q, K, N);     return 0;}
// Java program to find the count of// all the sub-Strings with weight of// characters atmost Kimport java.util.*; class GFG{  // Function to find the count of// all the subStrings with weight// of characters atmost Kstatic int distinctSubString(String P, String Q,                      int K, int N){      // Hashmap to store all subStrings    HashSet<String> S = new HashSet<String>();      // 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 codepublic 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
# 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 Kdef 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 codeP = "abcde"Q = "12345678912345678912345678"K = 5N = len(P) print(distinctSubstring(P, Q, K, N)) # This code is contributed by Sanjit_Prasad
// C# program to find the count of// all the sub-Strings with weight of// characters atmost Kusing System;using System.Collections.Generic; class GFG{   // Function to find the count of// all the subStrings with weight// of characters atmost Kstatic int distinctSubString(String P, String Q,                      int K, int N){       // Hashmap to store all subStrings    HashSet<String> S = new HashSet<String>();       // 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 codepublic 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
<script> // Javascript 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 Kfunction distinctSubString(P, Q, K, N){        // Hashmap to store all subStrings    let S = new Set();        // Iterate over all subStrings    for (let i = 0; i < N; ++i) {            // Maintain the sum of all characters        // encountered so far        let sum = 0;            // Maintain the subString till the        // current position        let s = "";            for (let j = i; j < N; ++j) {                // Get the position of the            // character in String Q            let pos = P[j].charCodeAt() - 'a'.charCodeAt();                // Add weight to current sum            sum += Q[pos].charCodeAt() - '0'.charCodeAt();                // 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.size;}  // Driver code           let P = "abcde";    let Q = "12345678912345678912345678";    let K = 5;    let N = P.length;        document.write(distinctSubString(P, Q, K, N));                                                                                          </script>
7
 
Time Complexity: O(N2)
Sanjit_Prasad
Rajput-Ji
29AjayKumar
splevel62
khushboogoyal499
arorakashish0911
Hash
Advanced Data Structure
Hash
Pattern Searching
Hash
Pattern Searching
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
2-3 Trees | (Search, Insert and Deletion)
Extendible Hashing (Dynamic approach to DBMS)
Count of strings whose prefix match with the given string to a given length k
Quad Tree
Proof that Dominant Set of a Graph is NP-Complete
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Internal Working of HashMap in Java
Hashing | Set 1 (Introduction)
Hashing | Set 3 (Open Addressing)
Count pairs with given sum