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

📅  最后修改于: 2021-09-04 08:04:52             🧑  作者: Mango

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

例子:

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

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

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

  • 使用 regex()函数形成字符串模式的正则表达式。
  • 使用函数smatch() 创建一个匹配M。
  • 使用函数regex_match() 检查字符串str 中字符串模式的存在:
  • 在上述步骤中,如果函数regex_match()返回True ,则打印“Yes”并查找字符串pattern的出现。否则,打印“否”
  • 创建一个数据类型为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)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live