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’的值存储在该数组中。之后,他们可以从函数中返回该结果数组。因为在实时开发中,需要从函数中返回结果而不是直接打印出来。