在给定字符串中,在每次出现子字符串 Y 之前,计算子字符串 X 的出现次数

data structurec++server side programmingprogramming更新于 2024/10/3 1:24:00

在此问题中,当我们在给定字符串中找到子字符串 Y 时,我们需要计算子字符串 X 在 str 中的总出现次数。我们可以继续计算子字符串 X 的出现次数,当我们得到子字符串 Y 时,我们可以打印计数值。

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

示例

输入str = "stuxystuxy"; X = "stu"; Y = "xy";

输出– 1 2

解释

在第一次出现子字符串 Y 之前,子字符串 X (stuxy) 出现了 1 次

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

输入– str = 'aaccddee' X = 'a' Y = 'e'

输出– 2 2

解释– 在第一个和第二个 'e' 之前,'a' 出现了 2 次。

输入– str = 'xyz' X = 'pq' Y = 'yz'

输出– 0

解释——子字符串"yz"在给定的字符串中仅出现一次,但"pq"没有出现。因此,输出为 0。

方法 1

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

算法

  • 定义"cntx"变量并将其初始化为零。

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

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

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

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

示例

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

// 函数用于在给定字符串中每次出现子字符串 Y 之前 cntX 子字符串 X 的出现次数
void countOccurrences(string str, string X, string Y) {
    // 存储 X 的出现次数
    int cntX = 0;
    // 获取字符串 str、X 和 Y 的长度
    int len = str.length();
    int A = X.length();
    int B = Y.length();
    // 遍历字符串 str
    for (int i = 0; i < len; i++) {
        // 如果子字符串 str[i, i+A-1] 等于 X,则将 cntX 加 1。
        if (str.substr(i, A) == X)
        cntX++;
        // 如果子字符串 str[i, i+B-1] 等于 Y,则打印 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

时间复杂度– O(len*(A + B)),len 是字符串 str 的长度。A 和 B 分别是子字符串 X 和 Y 的长度。

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

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


相关文章