我有两个字符串,想检查第二个字符串是否是第一个字符串的排列(当然,反之亦然)。 因此,我在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”字符串上吗?
希望你能帮助我。
答案 0 :(得分:0)
您可以结合使用std::string::substr
和is_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)
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)
希望有帮助。