【问题标题】:Which is the best data-structure for iterating through arrangements of a string?哪个是迭代字符串排列的最佳数据结构?
【发布时间】:2010-02-17 19:39:51
【问题描述】:

假设我们有字符串“ABCAD”,现在我们需要在顺时针和逆时针方向上遍历该字符串的所有可能排列。

我丑陋的实现是这样的:

string s = "ABCAD";
string t ="";
 for(int i = 0; i < sz(s); i++){
    t = s[i];
  for(int j = i+1; ; j++){
      if((j) == sz(s)){
         j = 0;
        }
       if(j == i){
          break;
        }
       t+= s[j];
     }
     cout<<t<<" ";
   }
reverse(all(s));
 for(int i = 0; i < sz(s); i++){
    t = s[i];
  for(int j = i+1; ; j++){
      if((j) == sz(s)){
         j = 0;
        }
       if(j == i){
          break;
        }
       t+= s[j];
     }
     cout<<t<<" ";
   }

输出:

AHSAU HSAUA 绍亚 AUAHS UAHSA UASHA 阿修 肖阿 豪斯 AUASH

我知道太天真了,AFAIK 循环列表会是更好的选择,有人可以使用 STL 更有效地实现同样的事情吗?

【问题讨论】:

标签: c++ stl data-structures


【解决方案1】:

在伪代码中,我会走这条路:

function rearrange (string s) {
  string t = s + s;
  for (int i = 0; i < length(s); ++i)
    print t.substring(i, length(s));
}

input = "ABCAD"

rearrange(input);
rearrange(reverse(input));

可能有一种方法可以使用函子重写重新排列(),但我的 STL-fu 生锈了。

【讨论】:

  • 是的,这很可爱 :) 你知道我自己刚得到它,然后我看到了你的答案 :)
  • 您可以像这样调用rearrange 完成此操作:function rearrange (string s) { string t = s + s; string q = reverse(s) + reverse(s); for (int i = 0; i &lt; length(s); ++i){ print t.substring(i, length(s)); print q.substring(i, length(s)); } }
【解决方案2】:

最好的解决方案不是数据结构而是算法——见next_permutation

【讨论】:

  • “ABCAD”的排列总数为5!/2! = 60,而我只需要 10。
  • @nthrgeek 你的意思是独特的排列吗?在这种情况下,将每一个保存在 std::set 中。
  • 只是顺时针和逆时针旋转 :)
  • @nthrgeek “方向”如何有所作为?如果我有“AB”唯一可能的唯一排列“AB”和“BA”。
  • 请启发我使用下一个排列解决问题。 :)
【解决方案3】:

我相信您正在寻找的是rotate 算法。对于反向的,您需要像在自己的代码中那样做相反的事情。

未经测试的代码可以完成您的工作:

std::string s = "ABCAD"

for (int i = 0; i < s.size(); ++i)
{
  std::cout << s << std::endl;
  std::rotate(s.begin(), s.begin() + 1, s.end());
}

reverse(s.begin(), s.end());

// same loop as above for reverse "arrangements"

【讨论】:

  • 把 for 循环放到它自己的函数里,我就卖了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多