权重和小于等于 K 的所有子字符串的计数


简介

在本教程中,我们将讨论从给定字符串中计算权重和小于等于 K 的子字符串的问题。为了实现问题陈述,我们考虑一个字符串 S 来生成子字符串,以及 k 的一些值。字符权重是预定义的整数值,我们考虑 K 的一些值,例如 2、3 或任何其他值。我们只计算总权重等于 K 值的那些子字符串。

字符的权重以两种不同的方式定义:

  • 当权重以任何顺序为字符串定义时。

  • 当权重按字母顺序从 1 开始定义时。

示例 1

String = "aba"
K = 5

输出

The possible substrings with their weights at most 5 is : 6

解释

使用输入字符串和 k 的值,我们按字母顺序从 1 开始获取字符的权重。'a' 的权重为 1,'b' 的权重为 2,'c' 的权重为 3,'d' 的权重为 4,依此类推。有 6 个可能的子字符串,其权重和小于等于 K。这些子字符串如下:

a
ab
aba
b
ba
a

示例 2

String = "abcd" 
Weight = "1234"
K = 6

输出

Number of substring with their weight at most 6 are 7.

解释

在上面的输入字符串中,我们初始化所有字符的权重。k 的值为 6。字符串“abcd”的字符权重分别为 1234。有 7 个可能的子字符串,其权重和小于等于 k。这些子字符串如下:

a
ab
ab
cb
bc
c
d

C++ 库函数

  • length() - 它是一个字符串类库函数,定义在标准 C++ 库中。它返回字符串的长度(以字节为单位)。

string_name.length();
  • vector - 它是在 C++ 中的动态数组。它提供了对数组的简单且高效的删除和更新操作。它可以是整数类型或字符串类型。

vector<data_type> vector_name;
  • unordered_set() - 它是在 C++ 中的容器,它随机存储元素,没有任何定义的顺序。它有助于快速检索其存储的元素。

unordered_set <data_type> unordered_set_name;

算法

  • 初始化输入字符串。

  • 考虑按字母顺序从 1 开始的字符权重。

  • 初始化 k 的值(最大可能的权重)。

  • 遍历所有权重最大等于 k 的子字符串。

  • 计数器变量计算所有权重最大为 k 的子字符串。

  • 打印 k 的结果。

示例 1

在这里,我们使用 C++ 实现问题陈述。用户定义函数“countSubstrings()”用于计算所有权重和小于等于 K 的子字符串。子字符串权重从 1 开始,并按字母顺序分配。

#include <iostream>
#include <string>

using namespace std;

int countSubstrings(const string& s, int K) {
   int cnt = 0;
   int l = s.length();
    
   for (int x = 0; x < l; x++){
      int sum = 0;
        
      for (int y = x; y < l; y++) {
         // Calculate the weight of the substring from index i to j
         sum += s[y] - 'a' + 1;  // Assuming weights are based on alphabetical order
         
         // If the sum of weights is less than or equal to K, increment the count
         if (sum <= K){
            cnt++;
         }
      }
   }
    
   return cnt;
}
int main() {
   string s = "aba";  // Predefined string
   int K = 5;  // Predefined maximum weight
   
   int Output = countSubstrings(s, K);
   cout << "Count of substrings with sum of weights at most " << K << ": " << Output << endl;
   
   // Generating substrings
   cout << "Substrings with sum of weights at most " << K << ":" << endl;
   int l = s.length();
   for (int x = 0; x < l; x++) {
      for (int y = x; y < l; y++){
         string substrg = s.substr(x, y - x + 1);
         int weight = 0;
         for (char ch : substrg){
            weight += ch - 'a' + 1;
         }
         if (weight <= K) {
            cout << substrg << endl;
         }
      }
   }
    
   return 0;
}

输出

Count of substrings with sum of weights at most 5: 6
Substrings with sum of weights at most 5:
a
ab
aba
b
ba
a

示例 2

我们使用 C++ 实现任务。初始化一个字符字符串和一个加权字符串。加权字符串元素用作输入字符串权重。使用嵌套循环使用加权字符串生成子字符串。计算权重和小于等于 K 的子字符串。

#include <iostream>
#include <unordered_set>
using namespace std;

//user-defined function to generate the substrings
void generateSubstrings(string s, string weights, int K, unordered_set<string>& substrings){
   //taking length of the input string
   int l = s.length();

   //loop for generating all substrings
   for (int x = 0; x < l; x++){
      for (int y = 1; y <= l - x; y++) {
         string substring = s.substr(x, y);
     
         //Sum variable to calculate the weights
         int sumString = 0;
         for (char c : substring){
            int post = c - 'a';
            sumString += weights[post] - '0';
         }
         //when string sun is less than equal to K, insert the substring
         if (sumString <= K){
            substrings.insert(substring);
            cout << substring << endl;
         }
      }
   }
}

//Code controller
int main(){
   //initialize string
   string S = "abcd";

   //initialize weight variable
   string W = "1234";

   //initialize value of K
   int K = 6;

   unordered_set<string> substrings;

   //calling function
   generateSubstrings(S, W, K, substrings);

   cout << "Count of substrings with weights at most " << K << ": " << substrings.size() << endl;

   return 0;
}

输出

a
ab
abc
b
bc
c
d
Count of substrings with weights at most 6: 7

结论

在本教程中,我们计算了权重最大为 k 的所有子字符串。我们使用两种不同的方法实现了该任务。在第一种情况下,我们使用加权字符串来初始化输入字符串字符的权重。在第二种情况下,权重按字母顺序从 1 开始定义。C++ 用于使用嵌套循环概念实现这两种情况。

在编写 C++ 代码以理解问题陈述的需求并计算子字符串之前,我们用一些示例演示了该问题。

更新于: 2023年9月29日

464 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告