📜  C++中的is_permutation()及其在字谜搜索中的应用

📅  最后修改于: 2021-04-29 18:54:17             🧑  作者: Mango

is_permutations()用于检查字符串和向量之类的两个容器是否相互置换。它接受三个参数,前两个参数是第一个对象的开始和结束位置,第三个参数是第二个对象的开始位置。

// C++ program to demonstrate working of
// is_permutation()
#include 
using namespace std;
  
// Driver program to test above
int main()
{
    vector v1{1, 2, 3, 4};
    vector v2{2, 3, 1, 4};
  
    // v1 and v2 are permutation of each other
    if (is_permutation(v1.begin(), v1.end(), v2.begin()))
        cout << "True\n";
    else
        cout << "False\n";
  
    // v1 and v3 are NOT permutation of each other
    vector v3{5, 3, 1, 4};
    if (is_permutation(v1.begin(), v1.end(), v3.begin()))
        cout << "True\n";
    else
        cout << "False\n";
  
    return 0;
}

输出 :

True
False

应用 :

给定一个模式和一个文本,找到文本中所有出现的模式及其七巧板。

例子:

Input : text ="forxxorfxdofr"  
        pat = "for"
Output :  3
There are three anagrams of "for"
int text.

Input : word = "aabaabaa" 
        text = "aaba"
Output : 4

我们已经讨论了一个(n)解决方案。但是在这篇文章中,它是使用is_permutation()完成的。尽管复杂度高于先前讨论的方法,但目的是解释is_permutation()的应用。

将要搜索的模式的大小设为pat_len。这个想法是遍历给定的文本,对于pat_len大小的每个窗口,检查它是否是给定模式的排列。

// C++ program to count all permutation of
// given text
#include
using namespace std;
  
// Function to count occurrences of anagrams of pat
int countAnagrams(string text, string pat)
{
    int t_len = text.length();
    int p_len = pat.length();
  
    // Start traversing the text
    int count = 0; // Initialize result
    for (int i=0; i<=t_len-p_len; i++)
  
        // Check if substring text[i..i+p_len]
        // is a permutation of pat[].
        // Three parameters are :
        // 1) Beginning position of current window in text
        // 2) End position of current window in text
        // 3) Pattern to be mathced with current window
        if (is_permutation(text.begin()+i,
                           text.begin()+i+p_len,
                           pat.begin()))
            count++;
  
    return count;
}
  
// Driver code
int main()
{
    string str = "forxxorfxdofr";
    string pat = "for";
    cout << countAnagrams(str, pat) << endl;
    return 0;
}

输出:

3
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”