【问题标题】:Find an hidden permutation of a string C++查找字符串 C++ 的隐藏排列
【发布时间】:2018-11-10 10:36:46
【问题描述】:

我有两个字符串,并想检查第二个是否是第一个的排列(当然反之亦然)。 所以我在 cplusplus 参考资料中发现 algorithm 库的 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 字符串,里面有一个熊的排列,所以是这样的:

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

如您所见,仍然存在排列“reab”。我如何才能真正检查是否存在隐藏的排列?最终,将其保存在“s3”不同的字符串上?

希望你能帮助我。

【问题讨论】:

  • 您可以检查所有四个(s1.length)字符连续子字符串,并在每个子字符串上使用 is_permutation。

标签: c++ string permutation


【解决方案1】:

您可以结合使用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

【讨论】:

  • 不客气 :) 当排列出现在字符串的末尾时,我对代码进行了细微的更改,以包含角落案例。
【解决方案2】:

正如 kingW3 在 cmets 中已经指出的那样,人们可以如何做到这一点。

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;

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

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

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

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    相关资源
    最近更新 更多