C++ 统计给定字符串中每个子字符串Y之前子字符串X的出现次数

C++ 统计给定字符串中每个子字符串Y之前子字符串X的出现次数

在这个问题中,我们需要统计字符串Y在给定字符串中出现之前子字符串X的总次数。我们可以一直计算子字符串X的出现次数,当我们找到字符串Y时,可以打印出计数值。

问题描述 - 给定一个字符串str、X和Y。字符串的长度分别为N、A和B。我们需要统计在给定字符串str中,每次出现子字符串Y之前子字符串X的总数。

示例

输入 str = “stuxystuxy”; X = “stu”; Y = “xy”;

输出 - 1 2

解释

在第一次出现子字符串Y之前,我们有1次出现子字符串X(stuxy)。

在第二次出现子字符串Y之前,我们有2次出现子字符串X(stuxystuxy)。

输入 - str = ‘aaccddee’ X = ‘a’ Y = ‘e’

输出 - 2 2

解释 - 在第一次和第二次出现‘e’之前,‘a’出现了2次。

输入 - str = ‘xyz’ X = ‘pq’ Y = ‘yz’

输出 - 0

解释 - 在给定字符串中,子字符串‘yz’只出现了一次,但‘pq’没有出现。因此,输出为0。

方法

在这个方法中,如果我们在给定字符串中找到了子字符串X,我们将计数值增加1。当我们在字符串中找到子字符串Y时,我们将打印出计数值,以显示在每次子字符串Y之前子字符串X的出现次数。

步骤

  • 将‘cntx’变量定义为0并初始化。

  • 将str、X和Y字符串的长度存储到len、A和B变量中。

  • 使用for循环遍历字符串。

  • 如果我们从当前索引开始找到了子字符串X,则将‘cntx’的值增加1。

  • 如果我们从当前索引开始找到了子字符串Y,则打印出‘cntx’的值。

示例

#include <bits/stdc++.h>
using namespace std;

// function to cntX the occurrences of substring X before every occurrence of substring Y in the given string
void countOccurrences(string str, string X, string Y) {
   // to store occurrences of X
   int cntX = 0;
   // get the lengths of strings str, X and Y
   int len = str.length();
   int A = X.length();
   int B = Y.length();
   // Traverse the string str
   for (int i = 0; i < len; i++) {
      // If the substring str[i, i+A-1] equals X, then increment cntX by 1.
      if (str.substr(i, A) == X)
          cntX++;
      // If the substring str[i, i+B-1] is equal to Y, then print cntX
      if (str.substr(i, B) == Y)
          cout << cntX << " ";
   }
}

int main() {
   string str = "stuxystuxy";
   string X = "stu";
   string Y = "xy";
   countOccurrences(str, X, Y);
   return 0;
}

输出

1 2

时间复杂度 - 当字符串str的长度为len时,其复杂度为O(len*(A + B)),其中A和B分别为子字符串X和Y的长度。

空间复杂度 - 由于我们使用常量空间来计算子字符串X的出现次数,所以复杂度为O(1)。

在以上代码中,当我们从第i个索引开始找到子字符串Y时,我们打印出‘cntx’的值。程序员可以创建一个数组,并在找到子字符串Y时将‘cntX’的值存储在该数组中。之后,他们可以从函数中返回该结果数组。因为在实时开发中,需要从函数中返回结果而不是直接打印出来。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程