在给定字符串中,在每次出现子字符串 Y 之前,计算子字符串 X 的出现次数
在此问题中,当我们在给定字符串中找到子字符串 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"的值存储在数组中。之后。他们可以从函数返回结果数组,因为在实时开发中,需要从函数返回结果而不是打印。