【问题标题】:Generating conditional permutations of a given string生成给定字符串的条件排列
【发布时间】:2013-12-04 19:47:07
【问题描述】:

我有一个非常直截了当的问题。答案可能并非如此。

如果我有一个字符串说“RANDOM”,并说我想在给定条件的情况下生成字符串的排列,“A”总是在左数第三个,即在 arr[2] if arr持有字符串。有人可能会建议生成所有可能的结果,然后寻找具有 arr[2] = '0' 但鉴于我的代码是 O(n*n!) 的事实,我认为我真的不想这样做。

我是 C++ 中级。

【问题讨论】:

  • 你说你有代码。它在哪里?

标签: c++ conditional unique permutation


【解决方案1】:

这取决于如何指定条件。例如,您可以创建一个从0length(YOUR_STRING) 的数字向量,而没有对应于前缀字符的索引。

然后,您可以将random shuffle 应用于该向量,并在改组向量(加上预先固定的向量)指示的位置写入一个带有YOUR_STRING 字符的新字符串。

一个例子:

std::string yourString = "foo bar bar";
/* pre-fixed characters */
size_t fixedPositionsOrigin[2] = {0, 4}; // "f" and first "b" 
size_t fixedPositionsDestin[2] = {8, 2}; // "f" will be put in position 8, first "b" in position 2
/* Other indices */
std::vector<size_t> remainingIndices = {1, 2, 3, 5, 6, 7, 8, 9, 10}; // valid in C++11 only
std::vectro<size_t> shuffledIndices(remainingIndices); // copy 
std::random_shuffle(shuffledIndices.begin(), shuffledIndices.end());
/* New string */
std::string newString(yourString.size(), " "); // empty string
// Add pre-fixed characters at correct positions
newString[fixedPositionsDestin[idx]] = yourString[fixedPositionsOrigin[idx]]; // something like this in a loop
// add shuffled characters at correct positions 
newString[shuffledIndices[idx]] = yourString[remainingIndices[idx]]; // something like this in a loop

就是这样。当然,有多种方法可以改进此代码。我什至不知道它是否编译。 您可能希望将random_shuffle 版本与生成器一起使用,以便您“控制”随机数的生成。

【讨论】:

  • 我认为你解释得恰到好处。明白其中的逻辑。谢了哥们。干杯!
  • 如果您喜欢它,并且确实是最佳答案,请尝试“接受它”(绿色勾号);-)
  • 虽然你能帮我用 Turbo C 实现这个吗? ://
  • Turbo C?没有“++”?用普通数组替换向量并使用另一种“shuffle”函数(看看stackoverflow.com/questions/6127503/shuffle-array-in-c
猜你喜欢
  • 2019-12-09
  • 2011-05-13
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 2016-10-30
  • 1970-01-01
相关资源
最近更新 更多