[英]Given a set of characters, how can you display the string with a higher lexicographical order, only by rearranging the characters?
[英]Algorithm to print all combination of letters of the given string in lexicographical order
我試圖創建代碼以按字典順序生成給定字符串的所有可能組合:
我寫的代碼是:
void get(char *n)
{
int l=strlen(n);
sort(n,n+l);
int k=0,m,i,j,z;
while(k<l)
{
m=k;
for(i=k;i<l;i++)
{
for(j=k;j<=i;j++)
cout<<n[j];
cout<<"\n";
}
for(z=m+2;z<l;z++)
cout<<n[m]<<n[z]<<"\n";
k++;
}
}
int main()
{
char n[100];
cin>>n;
get(n);
return 0;
}
假設字符串是:abcde
我的代碼未生成如下組合:
abd
abe
我得到的字符串abcde的輸出是:
a
ab
abc
abcd
abcde
ac
ad
ae
b
bc
bcd
bcde
bd
be
c
cd
cde
ce
d
de
e
我的輸出不包含以下字符串: abd abe
希望這可以使問題清楚
如何使用高效算法生成所有這些組合
這是一種簡單的遞歸方法:
#include <string>
#include <iostream>
using namespace std;
void get( string str, string res ) {
cout << res << endl;
for( int i = 0; i < str.length(); i++ )
get( string(str).erase(i,1), res + str[i] );
}
int main( int argc, char **argv) {
string str = "abcde";
get( str, "" );
return 0;
}
可能不是最有效的方法,而是一種簡短的方法。 請記住,枚舉所有組合的復雜度始終為O(2 n ) 。 因此根本不存在有效的算法。
以下內容可能會有所幫助:
bool increase(std::vector<bool>& bs)
{
for (std::size_t i = 0; i != bs.size(); ++i) {
bs[i] = !bs[i];
if (bs[i] == true) {
return true;
}
}
return false; // overflow
}
template <typename T>
void PowerSet(const std::vector<T>& v)
{
std::vector<bool> bitset(v.size());
do {
for (std::size_t i = 0; i != v.size(); ++i) {
if (bitset[i]) {
std::cout << v[i] << " ";
}
}
std::cout << std::endl;
} while (increase(bitset));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.