假设我们有字符串ABCD
我想创建以下树:
ABCD <------ level 1
ABC ABD ACD BCD <------ level 2
AB AC AD BC BD CD <------ level 3
A B C D <------ level 4
按以下顺序将其保存在矢量中:
ABCD->ABC->ABD->ACD->BCD->AB->AC->AD->BC->BD->CD->A->B->C->D
所以从起点开始,我想生成下一级节点,将它们存储在向量中,然后生成下一级节点并对所有剩余级别执行相同操作
我创建了以下程序,从1级生成2级。
void test(int dimensions, vector<string> & nodes, const char* currentNode){
int i,j;
for(i=dimensions-1;i>=0;i--){
char *temp = new char[dimensions];
int counter = 0;
for(j=0;j<dimensions;j++){
if(j!=i){
temp[counter] = currentNode[j];
counter++;
}
}
temp[counter] = '\0';
nodes.push_back(temp);
}
}
从main调用:
vector<string> nodes;
int dimension = 4;
nodes.push_back("ABCD");
test(dimension, nodes, "ABCD");
这给了我以下内容:
正如您所见,级别2的节点已成功添加,但是如果我尝试在此处应用递归,例如节点“ABC”
我会得到结果:
AB -> AC -> BC
这些将成功保存,但是如果递归继续进行,例如对于节点AB
现在它将找到A -> B
所以保存在向量中的节点的结果顺序将不是我在开头描述的方式。
而不是
ABCD->ABC->ABD->ACD->BCD->AB->AC->AD->BC->BD->CD->...
它将是
ABCD->ABC->ABD->ACD->BCD->AB->AC->A->B->...
最后,我希望这个树的计算可以推广到任意数量的维度。例如,初始节点可以是ABCD
或ABCDEFGHIJKLM
。
出于某种原因,我认为这很难做到,但我并不确定。请注意,我不想使用任何外部库来计算排列,我需要了解100%的代码才能继续执行我想要实现的算法。
提前谢谢
答案 0 :(得分:1)
正如评论中所述,我不知道这与排列有多远,但这里是我认为你想要实现的代码:
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
typedef std::vector<std::string> Layer;
Layer getNextLayer(const Layer &);
int main()
{
std::vector<Layer> layers;
layers.push_back(Layer());
layers[0].push_back("ABCDE");
while ( layers.back().back().size() > 1 )
{
layers.push_back(getNextLayer(layers.back()));
for ( size_t i = 0; i < layers.back().size(); ++i )
{
std::cout << layers.back()[i] << " ";
}
std::cout << "\n";
}
}
Layer getNextLayer(const Layer &layer)
{
Layer result;
for ( size_t i = 0; i < layer.size(); ++i )
{
const std::string item = layer[i];
for ( size_t j = 0; j < item.size(); ++j )
{
std::string new_item = item;
new_item.erase(new_item.begin() + j); // erase j^th charachter from item
result.push_back(new_item);
}
}
std::sort(result.begin(), result.end());
result.erase(std::unique(result.begin(), result.end()), result.end()); // erase duplicates
return result;
}
这将根据最后一层创建每个图层。要将它们全部存储在一个向量中,您只需合并所有这些图层。