给定长度为N的字符串str和长度为M的子字符串模式,任务是找到模式作为给定字符串的子字符串出现的频率。如果字符串str 中存在模式,则打印“ Yes ”及其出现次数。否则,打印“否” 。
例子:
Input: str = “geeksforgeeks”, pattern = “geeks”
Output: 2
Explanation:
The occurrence of the string “geeks” in the string “geeksforgeeks” is at index 0 and 8.
Therefore, the count is 2.
Input: str = “dhimanman”, pattern = “max”
Output: 0
朴素的方法:请参阅上一篇文章,了解解决问题的最简单方法。
时间复杂度: O(N*M)
辅助空间: O(1)
使用KMP算法的方法:参考本文的前一篇文章使用KMP算法解决问题。
时间复杂度: O(N + M)
辅助空间: O(M)
使用正则表达式的方法:按照以下步骤解决问题:
- 使用 regex()函数形成字符串模式的正则表达式。
- 使用函数smatch() 创建一个匹配M。
- 使用函数regex_match() 检查字符串str 中字符串模式的存在:
regex_search(str, m, c)
where,
str is the given string,
m is smatch,
c is the regular expression of the string pattern.
- 在上述步骤中,如果函数regex_match()返回True ,则打印“Yes”并查找字符串pattern的出现。否则,打印“否” 。
- 创建一个数据类型为ptrdiff_t的变量numberOfMatches来存储出现次数。
- 使用函数regex_iterator()函数查找numberOfMatches为:
ptrdiff_t numberOfMatches = std::distance(sregex_iterator(S.begin(), S.end(), c), sregex_iterator())
- 打印上述步骤中出现的次数作为结果。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to find the frequency of
// substring in the given string S
void find_frequency(string S,
string pattern)
{
// Create a regular expression
// of the string pattern
regex c(pattern);
// Determines the matching behavior
smatch m;
// Use member function on 'm'
// regex_search to check if
// string X is present in S or not
if (regex_search(S, m, c) == true) {
cout << "Yes"
<< "\n";
}
else {
cout << "No";
}
// Count the number of matches
ptrdiff_t numberOfMatches
= std::distance(
sregex_iterator(S.begin(),
S.end(), c),
sregex_iterator());
// Print the coun of occurrence
cout << "Frequency of string "
<< pattern << " is "
<< numberOfMatches;
}
// Driver code
int32_t main()
{
// Given string str and pattern
string str = "geeksforgeeks";
string pattern = "geeks";
// Function Call
find_frequency(str, pattern);
return 0;
}
Yes
Frequency of string geeks is 2
时间复杂度: O(N + M)
辅助空间: O(M)
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live