【发布时间】:2023-03-13 09:27:01
【问题描述】:
我正在尝试对 8 个字符进行排列,但我只对最多包含 3 个相同字符的输出感兴趣。因此,应跳过包含超过 3 次出现的任何字符的任何输出。
字符集:a、b、c、d、e、f、g、G
示例:
对输出不感兴趣,例如aaaaaaab , aabcdeaa, acdGGGGg, GGGGbbbb ...
对输出感兴趣,例如abcdefgG, aaabcdef, abacadGf ...
我尝试编写一个代码,在每个循环中评估每个字符的出现次数,如果出现超过 3 个相同的字符,则跳过(中断/继续)到下一个循环。
这是我无法解决的代码问题。该程序仅执行以字符“a”开头并在 aaabgGGG 处停止的排列,我无法管理它以继续以 b、c、d、e 等开头的迭代...
我想在循环期间实现过滤以避免发生不需要的循环 => 尽可能快地处理。
注释 ##### 行之间的“>3 次出现过滤器”代码时,所有排列都被正确处理。
我的代码:
#include <iostream>
// C++ program to print all possible strings of length k
using namespace std;
int procbreak = 0;
// The main recursive method to print all possible strings of length k
void printAllKLengthRec(char set[], int setn[], string prefix, int n, int k)
{
// Base case: k is 0, print prefix
//cout << "03. In printAllKLengthRec function" << endl;
if (k == 0)
{
//print table with characters and their count
cout << (prefix) << endl;
cout << " | ";
for (size_t b = 0; b < 8; b++)
{
cout << set[b] << " | ";
}
cout << endl;
cout << " | ";
for (size_t c = 0; c < 8; c++)
{
cout << setn[c] << " | ";
}
cout << endl;
return;
}
// One by one add all characters from set and recursively call for k equals to k-1
for (int i = 0; i < n; i++)
{
cout << "04. In for loop where one by one all chars are added. K = " << k << "; I = " << i << "; N = " << n << endl;
string newPrefix;
//update characters count table
setn[i] += 1;
if (i > 0)
{
setn[i - 1] -= 1;
}
else
{
if (setn[7] > 0)
{
setn[7] -= 1;
}
}
//#############################################################################################
//check if there is any character in a table with count more than 3, then break current cycle
for (size_t d = 0; d < 8; d++)
{
if (setn[d] > 3)
{
procbreak = 1;
break; // enough to find one char with >3, then we don't need to continue and break operation
}
}
if (procbreak == 1)
{
procbreak = 0; // reset procbreak
continue; // skip to next cycle
}
//#############################################################################################
// Next character of input added
newPrefix = prefix + set[i];
// k is decreased, because we have added a new character
printAllKLengthRec(set, setn, newPrefix, n, k - 1);
}
}
void printAllKLength(char set[],int setn[], int k, int n)
{
cout << "02. In printAllKLength function" << endl;
printAllKLengthRec(set, setn, "", n, k);
}
// Main code
int main()
{
cout << "Start" << endl;
char set1[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'G' };
int setn[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
int k = 8; // string length
printAllKLength(set1, setn, k, 8); // 8 = n => number of characters in the set1
}
我的代码逻辑中的主要错误在哪里?
【问题讨论】:
-
您正在寻找组合而不是排列。 8 个字符的排列都只包含 8 个字符中的每一个。
-
我不同意,据我所知,这是“重复排列”。
-
@enki:C++甚至还有一个函数
std::is_permutation,和idclev 463035818一致。
标签: c++ permutation