在 CPP 中重复打印选定长度字符的所有排列
Print all permutations of selected length characters with repetition in CPP
这段代码只打印数字!
我应该怎么做才能打印字符串?!
例如,我选择 5 作为 ABC 的长度,输出应该是:
aaaaa
aaaab
aaaac
aaaba
aaabb
aaabc
aaaca
aaacb
aaacc
aabaa
aabab
aabac
aabba
aabbb
aabbc
aabca
aabcb
aabcc
aacaa
aacab
aacac
aacba
aacbb
aacbc
aacca
aaccb
aaccc
abaaa
abaab
abaac
ababa
ababb
ababc
abaca
abacb
abacc
abbaa
abbab
abbac
abbba
abbbb
abbbc
abbca
abbcb
abbcc
abcaa
abcab
abcac
abcba
abcbb
abcbc
abcca
abccb
abccc
acaaa
acaab
acaac
acaba
acabb
acabc
acaca
acacb
acacc
acbaa
acbab
acbac
acbba
acbbb
acbbc
acbca
acbcb
acbcc
accaa
accab
accac
accba
accbb
accbc
accca
acccb
acccc
baaaa
baaab
baaac
baaba
baabb
baabc
baaca
baacb
baacc
babaa
babab
babac
babba
babbb
babbc
babca
babcb
babcc
bacaa
bacab
bacac
bacba
bacbb
bacbc
bacca
baccb
baccc
bbaaa
bbaab
bbaac
bbaba
bbabb
bbabc
bbaca
bbacb
bbacc
bbbaa
bbbab
bbbac
bbbba
bbbbb
bbbbc
bbbca
bbbcb
bbbcc
bbcaa
bbcab
bbcac
bbcba
bbcbb
bbcbc
bbcca
bbccb
bbccc
bcaaa
bcaab
bcaac
bcaba
bcabb
bcabc
bcaca
bcacb
bcacc
bcbaa
bcbab
bcbac
bcbba
bcbbb
bcbbc
bcbca
bcbcb
bcbcc
bccaa
bccab
bccac
bccba
bccbb
bccbc
bccca
bcccb
bcccc
caaaa
caaab
caaac
caaba
caabb
caabc
caaca
caacb
caacc
cabaa
cabab
cabac
cabba
cabbb
cabbc
cabca
cabcb
cabcc
cacaa
cacab
cacac
cacba
cacbb
cacbc
cacca
caccb
caccc
cbaaa
cbaab
cbaac
cbaba
cbabb
cbabc
cbaca
cbacb
cbacc
cbbaa
cbbab
cbbac
cbbba
cbbbb
cbbbc
cbbca
cbbcb
cbbcc
cbcaa
cbcab
cbcac
cbcba
cbcbb
cbcbc
cbcca
cbccb
cbccc
ccaaa
ccaab
ccaac
ccaba
ccabb
ccabc
ccaca
ccacb
ccacc
ccbaa
ccbab
ccbac
ccbba
ccbbb
ccbbc
ccbca
ccbcb
ccbcc
cccaa
cccab
cccac
cccba
cccbb
cccbc
cccca
ccccb
ccccc
代码:
#include <stdio.h>
#include <list>
#include <string>
#include <iostream>
using namespace std;
int outputDigit;
string input[1000];
int num;
string final;
int z=0;
struct Generator
{
public:
Generator(int s): cSlots(s)
{
a = new int[s];
for (int i = 0; i < cSlots - 1; i++) {
a[i] = 1;
}
a[cSlots - 1] = 0;
nextInd = cSlots;
}
~Generator()
{
delete a;
}
bool doNext()
{
for (;;)
{
if (a[nextInd - 1] == cValues) {
nextInd--;
if (nextInd == 0)
return false;
}
else {
a[nextInd - 1]++;
while (nextInd < cSlots) {
nextInd++;
a[nextInd - 1] = 1;
}
return true;
}
}
}
void doPrint()
{
for (int i = 0; i < cSlots; i++) {
num=a[i];
cout<<num;
}
printf("\n");
}
public:
int *a;
int cSlots;
int cValues;
int nextInd;
};
int main()
{
cout<<"enter outputDigits";
cin>>outputDigit;
Generator g(outputDigit);
while (g.doNext()) {
g.doPrint();
}
return 0;
}
但输出是
enter outputDigits5
11121
11122
11123
11124
11125
11126
11127
11128
11129
111210
111211
111212
111213
111214
111215
111216
111217
111218
111219
111220
111221
111222
111223
111224
111225
111226
111227
111228
111229
111230
111231
111232
111233
111234
111235......
什么是 cValues
?
我知道这个答案不会直接给你正确答案。但是,我建议您确保:
• 在构造函数中初始化所有属性。
• 避免使用全局成员。
• 使用更具描述性的名称。
• 尝试先使用较小的输入(例如 2 或 3)重现错误。
此致,
您可以进行简单的穷举搜索。
#include <iostream>
#include <string>
using namespace std;
void enumerate(const string& s, int n, string t = "")
{
if (n == 0)
cout << t << endl;
else
{
for (char c : s)
enumerate(s, n - 1, t + c);
}
}
int main()
{
enumerate("abc", 5);
}
复杂度:O(s.size()^n)
硬代码解决方案是:
const char choices[] = {'a', 'b', 'c'};
for (int a1 : choices) {
for (int a2 : choices) {
for (int a3 : choices) {
for (int a4 : choices) {
for (int a5 : choices) {
do_job(a1, a2, a3, a4, a5);
}
}
}
}
}
您可以使用以下通用方法(将所有 a
放入向量中):
template <typename T>
bool increase(const std::vector<T>& v, std::vector<std::size_t>& it)
{
for (std::size_t i = 0, size = it.size(); i != size; ++i) {
const std::size_t index = size - 1 - i;
++it[index];
if (it[index] >= v.size()) {
it[index] = 0;
} else {
return true;
}
}
return false;
}
template <typename T>
void do_job(const std::vector<T>& v, const std::vector<std::size_t>& it)
{
for (const auto e : it) {
std::cout << v[e] << " ";
}
std::cout << std::endl;
}
template <typename T>
void iterate(const std::vector<T>& v, std::size_t size)
{
std::vector<std::size_t> it(size, 0);
do {
do_job(v, it);
} while (increase(v, it));
}
这段代码只打印数字! 我应该怎么做才能打印字符串?!
例如,我选择 5 作为 ABC 的长度,输出应该是:
aaaaa
aaaab
aaaac
aaaba
aaabb
aaabc
aaaca
aaacb
aaacc
aabaa
aabab
aabac
aabba
aabbb
aabbc
aabca
aabcb
aabcc
aacaa
aacab
aacac
aacba
aacbb
aacbc
aacca
aaccb
aaccc
abaaa
abaab
abaac
ababa
ababb
ababc
abaca
abacb
abacc
abbaa
abbab
abbac
abbba
abbbb
abbbc
abbca
abbcb
abbcc
abcaa
abcab
abcac
abcba
abcbb
abcbc
abcca
abccb
abccc
acaaa
acaab
acaac
acaba
acabb
acabc
acaca
acacb
acacc
acbaa
acbab
acbac
acbba
acbbb
acbbc
acbca
acbcb
acbcc
accaa
accab
accac
accba
accbb
accbc
accca
acccb
acccc
baaaa
baaab
baaac
baaba
baabb
baabc
baaca
baacb
baacc
babaa
babab
babac
babba
babbb
babbc
babca
babcb
babcc
bacaa
bacab
bacac
bacba
bacbb
bacbc
bacca
baccb
baccc
bbaaa
bbaab
bbaac
bbaba
bbabb
bbabc
bbaca
bbacb
bbacc
bbbaa
bbbab
bbbac
bbbba
bbbbb
bbbbc
bbbca
bbbcb
bbbcc
bbcaa
bbcab
bbcac
bbcba
bbcbb
bbcbc
bbcca
bbccb
bbccc
bcaaa
bcaab
bcaac
bcaba
bcabb
bcabc
bcaca
bcacb
bcacc
bcbaa
bcbab
bcbac
bcbba
bcbbb
bcbbc
bcbca
bcbcb
bcbcc
bccaa
bccab
bccac
bccba
bccbb
bccbc
bccca
bcccb
bcccc
caaaa
caaab
caaac
caaba
caabb
caabc
caaca
caacb
caacc
cabaa
cabab
cabac
cabba
cabbb
cabbc
cabca
cabcb
cabcc
cacaa
cacab
cacac
cacba
cacbb
cacbc
cacca
caccb
caccc
cbaaa
cbaab
cbaac
cbaba
cbabb
cbabc
cbaca
cbacb
cbacc
cbbaa
cbbab
cbbac
cbbba
cbbbb
cbbbc
cbbca
cbbcb
cbbcc
cbcaa
cbcab
cbcac
cbcba
cbcbb
cbcbc
cbcca
cbccb
cbccc
ccaaa
ccaab
ccaac
ccaba
ccabb
ccabc
ccaca
ccacb
ccacc
ccbaa
ccbab
ccbac
ccbba
ccbbb
ccbbc
ccbca
ccbcb
ccbcc
cccaa
cccab
cccac
cccba
cccbb
cccbc
cccca
ccccb
ccccc
代码:
#include <stdio.h>
#include <list>
#include <string>
#include <iostream>
using namespace std;
int outputDigit;
string input[1000];
int num;
string final;
int z=0;
struct Generator
{
public:
Generator(int s): cSlots(s)
{
a = new int[s];
for (int i = 0; i < cSlots - 1; i++) {
a[i] = 1;
}
a[cSlots - 1] = 0;
nextInd = cSlots;
}
~Generator()
{
delete a;
}
bool doNext()
{
for (;;)
{
if (a[nextInd - 1] == cValues) {
nextInd--;
if (nextInd == 0)
return false;
}
else {
a[nextInd - 1]++;
while (nextInd < cSlots) {
nextInd++;
a[nextInd - 1] = 1;
}
return true;
}
}
}
void doPrint()
{
for (int i = 0; i < cSlots; i++) {
num=a[i];
cout<<num;
}
printf("\n");
}
public:
int *a;
int cSlots;
int cValues;
int nextInd;
};
int main()
{
cout<<"enter outputDigits";
cin>>outputDigit;
Generator g(outputDigit);
while (g.doNext()) {
g.doPrint();
}
return 0;
}
但输出是
enter outputDigits5
11121
11122
11123
11124
11125
11126
11127
11128
11129
111210
111211
111212
111213
111214
111215
111216
111217
111218
111219
111220
111221
111222
111223
111224
111225
111226
111227
111228
111229
111230
111231
111232
111233
111234
111235......
什么是 cValues
?
我知道这个答案不会直接给你正确答案。但是,我建议您确保:
• 在构造函数中初始化所有属性。
• 避免使用全局成员。
• 使用更具描述性的名称。
• 尝试先使用较小的输入(例如 2 或 3)重现错误。
此致,
您可以进行简单的穷举搜索。
#include <iostream>
#include <string>
using namespace std;
void enumerate(const string& s, int n, string t = "")
{
if (n == 0)
cout << t << endl;
else
{
for (char c : s)
enumerate(s, n - 1, t + c);
}
}
int main()
{
enumerate("abc", 5);
}
复杂度:O(s.size()^n)
硬代码解决方案是:
const char choices[] = {'a', 'b', 'c'};
for (int a1 : choices) {
for (int a2 : choices) {
for (int a3 : choices) {
for (int a4 : choices) {
for (int a5 : choices) {
do_job(a1, a2, a3, a4, a5);
}
}
}
}
}
您可以使用以下通用方法(将所有 a
放入向量中):
template <typename T>
bool increase(const std::vector<T>& v, std::vector<std::size_t>& it)
{
for (std::size_t i = 0, size = it.size(); i != size; ++i) {
const std::size_t index = size - 1 - i;
++it[index];
if (it[index] >= v.size()) {
it[index] = 0;
} else {
return true;
}
}
return false;
}
template <typename T>
void do_job(const std::vector<T>& v, const std::vector<std::size_t>& it)
{
for (const auto e : it) {
std::cout << v[e] << " ";
}
std::cout << std::endl;
}
template <typename T>
void iterate(const std::vector<T>& v, std::size_t size)
{
std::vector<std::size_t> it(size, 0);
do {
do_job(v, it);
} while (increase(v, it));
}