📜  在字符串中的子串的频率|套装2

📅  最后修改于: 2021-04-24 21:53:54             🧑  作者: Mango

给定长度为N的字符串str和长度为M的子字符串模式,任务是查找给定字符串中子字符串模式出现的频率。如果字符串str中存在pattern ,则打印“ Yes ”及其出现的次数。否则,打印“否”

例子:

天真的方法:有关解决问题的最简单方法,请参阅上一篇文章。
时间复杂度: O(N * M)
辅助空间: O(1)

使用KMP算法的方法:请参阅本文的上一篇文章,以解决使用KMP算法的问题。
时间复杂度: O(N + M)
辅助空间: O(M)

使用正则表达式的方法:请按照以下步骤解决问题:

  • 使用regex()函数形成字符串模式的正则表达式。
  • 创建SMATCH使用M函数SMATCH()。
  • 使用regex_match()函数检查字符串str中是否存在字符串模式
  • 在上述步骤中,如果函数regex_match()返回True ,则显示“是”并找到字符串模式的出现。否则,打印“否”
  • 创建数据类型为ptrdiff_t的变量numberOfMatches来存储出现次数。
  • 查找使用函数regex_iterator()函数作为numberOfMatches:
  • 将上述步骤中的出现次数打印为结果。

下面是上述方法的实现:

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)