查找字符串C ++的隐藏置换

时间:2018-11-10 10:36:47

标签: c++ string permutation

我有两个字符串,想检查第二个字符串是否是第一个字符串的排列(当然,反之亦然)。 因此,我在cplusplus参考上发现,库 算法 is_permutation 功能可以为我提供帮助。确实,我有以下代码:

int main () {
   string s1 = "bear";
   string s2 = "reab";
   if ( is_permutation (s1.begin(), s1.end(), s2.begin()) )
        cout << "Found permutation.\n";
   else cout << "No permutations found.\n";
   return 0;
}

这有效。但是,举例来说,现在我仍然有字符串“ bear”,还有第二个 random 字符串,里面有一个排列成Bear的字符串,所以像这样: / p>

s1 = "bear";
s2 = "AsdVYTcKIyqbNQreabJUoBn";

如您所见,仍然存在排列“收割”。如何实际检查是否存在隐藏的排列?最后,将其保存在另一个“ s3”字符串上吗?

希望你能帮助我。

2 个答案:

答案 0 :(得分:0)

您可以结合使用std::string::substris_permutation来实现这一目标。

// Example program
#include <iostream>
#include <string>
#include <algorithm>
using std::string;
using std::cout;

int main () {
    string s1 = "bear";   
    string s2 = "AsdVYTcKIyqbNQJUoBnreab";
    size_t i;
    for( i = 0; i <= s2.size() - s1.size(); i++)
    {
        string s3 =  s2.substr(i, s1.size());
        if ( is_permutation (s1.begin(), s1.end(), s3.begin()))
        {
            cout << "Found permutation.\n";
            break;
        }
        else 
        {
            continue;            
        }          
    }
    if(i > s2.size() - s1.size())
        cout << "No permutations found.\n";
    return 0;
}

观看现场演示here

答案 1 :(得分:0)

正如kingW3在评论中指出的那样。

string s1 = "bear";
string s2 = "AsdVYTcKIyqbNQreabJUoBn";
string key = "";

for (int i = 0; i < s2.length()+1 - s1.length(); i++)
{
    key = s2.substr(i, s1.length());
    if (is_permutation(s1.begin(), s1.end(), key.begin()))
        cout << "Found permutation.\n";
    else cout << "No permutations found.\n";
}
return 0;

编辑:请注意,必须使用+1或-1编写for循环条件,以便从第二个字符串中获取最后一个字符。

    i < s2.length()+1 - s1.length()

    i < s2.length() - (s1.length()-1)

希望有帮助。