📜  所有子串的权重总和不超过K

📅  最后修改于: 2021-04-17 11:06:09             🧑  作者: Mango

给定由小英文字母组成的字符串S和由英文字母所有字符的权重组成的字符串W,其中对于所有i,

0 \leq Qi \leq 9

。我们必须找到唯一子串的总数,其权重总和最多为K。
例子:

方法:
为了解决上述问题,主要思想是简单地遍历所有子字符串,并保持到目前为止遇到的所有字符的权重之和。如果字符的总和不大于K,则将其插入哈希图中,否则将其丢弃并与另一个子字符串一起前进。最后,结果将是哈希图的大小,因为它存储了权重小于或等于K的所有子字符串。

下面是上述方法的实现:

C++
// C++ implementation to Count all
// sub-strings with sum of weights at most K
 
#include 
using namespace std;
 
// Function to count all substrings
int distinctSubstring(string& P, string& Q,
                      int K, int N)
{
 
    // Hashmap to store substrings
    unordered_set S;
 
    // iterate over all substrings
    for (int i = 0; i < N; ++i) {
 
        // variable to maintain sum
        // of all characters encountered
        int sum = 0;
 
        // variable to maintain
        // substring till current position
        string s;
 
        for (int j = i; j < N; ++j) {
            // get position of
            // character in string W
            int pos = P[j] - 'a';
 
            // add weight to current sum
            sum += Q[pos] - '0';
 
            // add current character to substring
            s += P[j];
 
            // check if sum of characters
            // is <=K insert in Hashmap
            if (sum <= K) {
                S.insert(s);
            }
            else {
                break;
            }
        }
    }
 
    return S.size();
}
 
// Driver code
int main()
{
    // initialise string
    string S = "abcde";
 
    // initialise weight
    string W = "12345678912345678912345678";
 
    int K = 5;
 
    int N = S.length();
 
    cout << distinctSubstring(S, W, K, N);
 
    return 0;
}


Java
// Java implementation to count all
// sub-strings with sum of weights at most K
import java.io.*;
import java.util.*;
 
class GFG{
 
// Function to count all substrings
static int distinctSubstring(String P, String Q,
                             int K, int N)
{
     
    // Hashmap to store substrings
    Set S = new HashSet<>();
 
    // Iterate over all substrings
    for(int i = 0; i < N; ++i)
    {
         
        // Variable to maintain sum
        // of all characters encountered
        int sum = 0;
 
        // Variable to maintain substring
        // till current position
        String s = "";
 
        for(int j = i; j < N; ++j)
        {
             
            // Get position of
            // character in string W
            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);
 
            // Check if sum of characters
            // is <=K insert in Hashmap
            if (sum <= K)
            {
                S.add(s);
            }
            else
            {
                break;
            }
        }
    }
    return S.size();
}
 
// Driver Code
public static void main(String args[])
{
     
    // Initialise string
    String S = "abcde";
 
    // Initialise weight
    String W = "12345678912345678912345678";
 
    int K = 5;
    int N = S.length();
 
    System.out.println(distinctSubstring(S, W, K, N));
}
}
 
// This code is contributed by offbeat


Python3
# Python3 implementation to Count all
# sub-strings with sum of weights at most K
 
# Function to count all substrings
def distinctSubstring(P, Q, K, N):
 
    # Hashmap to store substrings
    S = set()
 
    # iterate over all substrings
    for i in range(N):
 
        # variable to maintain sum
        # of all characters encountered
        sum = 0
 
        # variable to maintain
        # substring till current position
        s = ""
 
        for j in range(i, N):
 
            # get position of
            # character in string W
            pos = ord(P[j]) - 97
 
            # add weight to current sum
            sum += ord(Q[pos]) - 48
 
            # add current character to substring
            s += P[j]
 
            # check if sum of characters
            # is <=K insert in Hashmap
            if (sum <= K):
                S.add(s)
 
            else:
                break
 
    return len(S)
 
# Driver code
if __name__ == '__main__':
    # initialise string
    S = "abcde"
 
    # initialise weight
    W = "12345678912345678912345678"
 
    K = 5
 
    N = len(S)
 
    print(distinctSubstring(S, W, K, N))
 
# This code is contributed by Surendra_Gangwar


C#
// C# implementation to count all sub-strings
// with sum of weights at most K 
using System;
using System.Collections.Generic;
 
class GFG{
     
// Function to count all substrings 
static int distinctSubstring(string P, string Q, 
                             int K, int N) 
{ 
     
    // Hashmap to store substrings 
    HashSet S = new HashSet();
   
    // Iterate over all substrings 
    for(int i = 0; i < N; ++i)
    { 
         
        // Variable to maintain sum 
        // of all characters encountered 
        int sum = 0; 
         
        // Variable to maintain substring
        // till current position 
        string s = ""; 
   
        for(int j = i; j < N; ++j)
        {
             
            // Get position of 
            // character in string W 
            int pos = P[j] - 'a'; 
   
            // Add weight to current sum 
            sum += Q[pos] - '0'; 
             
            // Add current character to
            // substring 
            s += P[j]; 
   
            // Check if sum of characters 
            // is <=K insert in Hashmap 
            if (sum <= K)
            {
                S.Add(s); 
            } 
            else
            { 
                break; 
            } 
        } 
    } 
    return S.Count; 
} 
 
// Driver code
static void Main()
{
     
    // Initialise string 
    string S = "abcde"; 
   
    // Initialise weight 
    string W = "12345678912345678912345678"; 
   
    int K = 5; 
    int N = S.Length; 
   
    Console.WriteLine(distinctSubstring(S, W, K, N)); 
}
}
 
// This code is contributed by divyeshrabadiya07


输出:
7