有没有一种方法可以使用排列来提供比想要排列的字符串更少的结果?
例如,如果用户输入一串字符,请说“dvoig”。在C ++中,如果我使用next_permutation
,它将只迭代这5个字母。所以我会得到输出,如; voidg,divgo,ovgid等。
到目前为止,我的代码是通常建议的:
int main()
{
string str;
cout << "Enter the string : ";
cin >> str;
sort(str.begin(), str.end());
do {
cout << str << endl;
} while (next_permutation(str.begin(), str.end()));
}
但是我也希望输出小于5,例如; void,divg,ovgi,dog,odg,oid,div,iv,go,do等。这是否可能,如果是这样,我该如何实现?
我花了最后12个小时试图让事情无济于事,我开始强调我的头发。
谢谢大家的帮助,非常感谢。
答案 0 :(得分:1)
您可以对next_permutation返回的每个字符串使用substr来获取子字符串。然后,您可以使用集合来聚合所有排列中的所有字符串,这些排列将自动为您处理重复项。像这样的东西会起作用:
#include<iostream>
#include<string>
#include<algorithm>
#include<unordered_set>
int main()
{
std::string str;
std::unordered_set<std::string> permutations;
std::cout << "Enter the string : ";
std::cin >> str;
std::sort(str.begin(), str.end());
unsigned int length = str.length();
do {
for (unsigned int i = 0; i < length; i++)
{
permutations.insert(str.substr(0, length - i - 1));
}
} while (std::next_permutation(str.begin(), str.end()));
std::for_each(permutations.begin(), permutations.end(), [](std::string permutation) {
std::cout << permutation << std::endl;
});
return 0;
}