代码之家  ›  专栏  ›  技术社区  ›  whacko__Cracko

哪种数据结构是迭代字符串排列的最佳数据结构?

  •  4
  • whacko__Cracko  · 技术社区  · 14 年前

    比如说,我们有字符串“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<<" ";
       }
    

    输出:

    阿苏 哈萨 索亚 奥哈斯 阿拉伯联合酋长国 乌沙 阿苏 绍阿 豪厄斯 奥什

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

    3 回复  |  直到 14 年前
        1
  •  4
  •   Lars    14 年前

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

    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));
    

    可能有一种方法可以使用函数重写remark(),但是我的stl-fu已经生锈了。

        2
  •  2
  •   anon    14 年前

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

        3
  •  2
  •   Peter Alexander    14 年前

    我相信你要找的是 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"