计算所有子字符串的权重和最多为 K

data structurec++server side programmingprogramming

简介

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

字符的权重有两种不同的定义方式 −

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

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

示例 1

String = "aba"
K = 5

输出

权重最多为 5 的可能子字符串为: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

输出

权重最多为 6 的子字符串数量为 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++) {
        // 计算从索引 i 到 j 的子字符串的权重
        sum += s[y] - 'a' + 1; // 假设权重基于字母顺序
        
        // 如果权重之和小于或等于 K,则增加计数
        if (sum <= K){
            cnt++;
        }
      }
   }
    
   return cnt;
}
int main() {
    string s = "aba"; // 预定义字符串
    int K = 5; // 预定义最大权重
    
    int Output = countSubstrings(s, K);
    cout << "权重和最多为 " << K << " 的子字符串计数: " << Output << endl;
    
    // 生成子字符串
    cout << "权重和最多为 " << 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;
}

输出

计算权重和最多为 5 的子字符串数量:6
计算权重和最多为 5 的子字符串数量:
a
ab
aba
b
ba
a

示例 2

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

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

//用户定义函数来生成子字符串
void generateSubstrings(string s, string weights, int K, unordered_set<string>& substrings){
    //获取输入字符串的长度
    int l = s.length();
    
    //循环生成所有子字符串
    for (int x = 0; x < l; x++){
      for (int y = 1; y <= l - x; y++) {
         string substring = s.substr(x, y);
     
        //求和变量以计算权重
        int sumString = 0;
        for (char c : substring){
            int post = c - 'a';
            sumString += weights[post] - '0';
        }
        //当字符串 sun 小于等于 K 时,插入子字符串
        if (sumString <= K){
            substrings.insert(substring);
            cout << substring << endl;
         }
      }
   }
}

//代码控制器
int main(){
    //初始化字符串
    string S = "abcd";
    
    //初始化权重变量
    string W = "1234";
    
    //初始化 K 的值
    int K = 6;
    
    unordered_set<string> substrings;
    
    //调用函数
    generateSubstrings(S, W, K, substrings);
    
    cout << "权重最多为 " << K << "的子字符串数量:" << substrings.size() << endl;
    
    return 0;
}

输出

a
ab
abc
b
bc
c
d
权重最多为 6 的子字符串的计数:7

结论

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

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


相关文章