【问题标题】:String concatenation to generate complementary removals字符串连接以生成互补删除
【发布时间】:2016-12-17 09:50:32
【问题描述】:

这个问题是对这个post 的轻微改动。 给定一个字符串,我想生成一个字符串向量 有 x 次移除。例如:

String a = "ABCD";
int x = 2;
//vector<string> residue = generate(a, x);
//vector residue would have the following elements: 
//"AB", "BC", "CD", "AC" "AD", "BD" 

完成此操作后,我想生成第二个 包含带有其他 2 个字符的字符串的字符串向量 删除。但是,代替删除,我想插入 .。例如:

//vector<string> residue2 would have the following elements:
//"..CD", "A..D", "AB..", ".B.D", ".BC.", "A.C."

这是我为x = 1 做的尝试。但是,我无法 生成第二个字符串或泛化x 等于任何数字。

vector<int> orignal; 
for(int i = 1; i <= 5; i++) original.push_back(i);
vector<int> data2;
for(int p1 = 0; p1 < length; p1++){
    auto data1 = original
    data1.erase(data1.begin()+p1);
    for(int p2 = 0; p2 < length; p2++){
        data2 = original;
        if(p2 != p1)
            data2.erase(data2.begin()+p2);
        //do stuff
    }
}

编辑: 我想要实现的是以下内容:(请参阅我的 x=1 的伪代码) 假设original = {1, 2, 3}。然后在外部for-loopdata1 = {2,3}data2 = {1,2,3} 的第一次迭代中,然后是data2={1,2,.}。在外部for-loopdata1 = {1,3}data2 = {1,2,.} 的第二次迭代中,然后是data2={.,2,3}。然后data1 = {1,2} 再继续一次。现在这是我只从原始元素中删除一个元素的时候。但是,我想概括这一点,以便data1 对 x x 删除。因此,data2 也会有 x 删除,但它会有条不紊地删除 data1 中尚未删除的元素。

【问题讨论】:

  • 这是来自 leetcode 吗?
  • 顺便说一句,有什么问题?
  • @Walter 我已经更新了问题。
  • 抱歉,这个不清楚。首先,它令人困惑(您放弃了字符串以支持数组?)其次,它不是“输出想要给定输入”,而是您想在各种循环中做什么。你为什么要那个?是否需要所有中间结果?我在回答中展示了如何实现第二个任务(原始问题)的结果。它不需要第一个任务的结果(并且不能仅从没有原始数据的任务 1 的输出中完成)。任务 1 可以以类似的方式完成。
  • 我想(猜想),你想调用一个例程(do_stuff(data1, data2),现在显示),其中data1data2original 的元素列表,由@987654347 制成@在某种程度上你没有很好地解释。正确的?我想,如果你举一个例子,其中包含对do_stuff() 的所有调用,比如n=4x=2,我们也许能够理解你。

标签: c++ string algorithm vector combinatorics


【解决方案1】:

您可以使用std::next_permutation() 循环遍历一组bool(表示输入或输出)的所有排列。例如

#include <string>
#include <vector>
#include <algorithm>

std::vector<std::string> generate(std::string const&str, std::size_t x)
{
  const auto size = str.size();
  std::vector<bool> perm(size);
  for(std::size_t i=0; i!=size; ++i)
    perm[i] = i>=x;
  std::vector<std::string> result;
  do {
    auto copy = str;
    for(std::size_t i=0; i!=size; ++i)
      if(!perm[i]) copy[i]='.';
    result.push_back(std::move(copy));
  } while(std::next_permutation(perm.begin(),perm.end()));
  return result;
}

例如对于str="ABCDE" x=2 我们得到

{"..CDE",".B.DE",".BC.E",".BCD.","A..DE","A.C.E","A.CD.","AB..E","AB.D.","ABC.."}

【讨论】:

  • 这是一个非常有用的答案!谢谢你。但是,我想要的略有不同。如果我对 OP 所做的编辑有助于更好地解释我想要什么,请告诉我。
  • 抱歉,这正是你所说的你想要的(对于residual2)。也许您应该更加努力地了解自己的需求,即询问之前您真正想要什么?
【解决方案2】:

假设你的字符串长度是 n。 还有 x

所以用x 1 和n-x 0 创建一个字符串。

string your_string="...";
for(int i=0;i<n;i++)
     ss+=(i<=n-x-1)?"0":"1";


do
{
   string temp="";
   for(int i=0;i<=n-1;i++)
     if(ss[i]=='1')
        temp+=".";
     else
        temp+=your_string[i];
   /*  process temp..*/
}
while(next_permutation(ss.begin(),ss.end())

例子

for n=3 x=2
"ABC"
A..  011
.B.  101
..C  110

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多