给定长度为N的字符串str和长度为M的子字符串模式,任务是查找给定字符串中子字符串模式出现的频率。如果字符串str中存在pattern ,则打印“ 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函数SMATCH()。
- 使用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 ,则显示“是”并找到字符串模式的出现。否则,打印“否” 。
- 创建数据类型为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)