给定由小英文字母组成的字符串S和由英文字母所有字符的权重组成的字符串W,其中对于所有i,
。我们必须找到唯一子串的总数,其权重总和最多为K。
例子:
Input : P = “ababab”, Q = “12345678912345678912345678”, K=5
Output : 7
Explanation :
The unique substrings are: “a”, “ab”, “b”, “bc”, “c”, “d”, “e”
Hence, the count is 7.
Input : P = “acbacbacaa”, Q = “12300045600078900012345000”, K=2
Output : 3
Explanation :The unique substrings are: “a”, “b”, “aa”
Hence, the count is 3.
方法:
为了解决上述问题,主要思想是简单地遍历所有子字符串,并保持到目前为止遇到的所有字符的权重之和。如果字符的总和不大于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