【问题标题】:Writing a permutation function编写置换函数
【发布时间】:2012-10-14 20:19:08
【问题描述】:

有人要求我编写一个使用递归的置换函数。该函数的唯一参数应该是我应该找到所有排列的字符串。该函数应返回具有所有可能排列的向量。我知道我可以在 STL 算法中使用 next_permutation,但有人要求我不要这样做。

我已经设置了基本情况,并且我知道我需要一个 for 循环,但我不太确定从那里去哪里。有人能指出我正确的方向吗?

vector <string> getPerm(string str)
{
    vector<string> v;
    if(w.length() <= 1)
    {
        v.push_back(str);
        return v;
    }
    else
    {
        for(int i = 0; i < str.size(); i++)
        {
            //Some code
        }
    }
}

任何帮助将不胜感激。

【问题讨论】:

  • 这是一个simple algorithm,用于创建连续排列,这可能会让你开始
  • @Collin 我认为这正是我所需要的!
  • 如果你正在编写一个使用递归的算法,你真的不想看科林的算法或next_permutation,因为它们都不是递归的。
  • @RondogiannisAristophanes 这不是重复的,因为那个版本不是递归的,而这个是。

标签: c++ vector permutation


【解决方案1】:

假设您已经有了函数上一次迭代的结果,并返回字符串前 n-1 个元素的所有排列。

vector<string>& v_prev = getPerm(str.substr(0, str.length()-1));

中使用这个
//Some code

部分代码。

另一个提示:使用长度为 0 的字符串作为递归的停止条件。您可以递归地构造 1 长度排列;)

这是整个解决方案:

vector<string> getPerm(string str)
{
  vector<string> v; 
  if (str.empty())
  {
    v.push_back(string());
    return v;
  }
  else
  {
    vector<string>& v_prev = getPerm(str.substr(0, str.length()-1));
    for(int i = 0; i < v_prev.size(); i++)
    {
      for (int j = 0; j < v_prev[i].length() + 1; j++)
      {
        string p = v_prev[i];
        p.insert(j, str.substr(str.length() - 1, 1));
        v.push_back(p);
      }
    }
    return v;
  }
}

【讨论】:

    【解决方案2】:

    想想字符串“123”的这些排列

    123
    132
    
    213
    231
    
    312
    321
    

    想想“12”的这些排列

    12
    21
    

    如果你知道所有n-1 字母子串的排列,你能看到如何构造n 字母串的排列吗?这种类型的解决方案将是递归的。

    【讨论】:

      【解决方案3】:
      • 对于yourArray 中的每个元素x
        • 复制不带元素xyourArray。调用这个新数组newArray
        • 查找newArray 的所有排列
        • 将元素 x 添加到每个排列的开头

      【讨论】:

        【解决方案4】:

        实现刚刚 Ken Bloom 所写的内容:

        vector <string> getPerm(string str)
        {
          vector<string> v;
          if(str.length() <= 1)
          {
            v.push_back(str);
            return v;
          }
          else
          {
            for(int i = 0; i < str.size(); i++){
              vector<string> perms = getPerm(str.substr(0,i)+str.substr(i+1));
        
              for(int j = 0; j < perms.size(); j++){
                v.push_back(str[i] + perms[j]);
              }
            }
          }
        }
        

        【讨论】:

        • 修复了“复制粘贴”问题
        【解决方案5】:

        试试这样的:

        permut(s) :
          if s.length=0 : exit;
          else :
            for i=0 to s.length :
              front:=s[i];
              remove(s,i);
              s2 := front + permut(s);
              print s2, NEWLINE;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-11-06
          • 2014-08-27
          • 1970-01-01
          • 2018-09-18
          • 2018-06-20
          • 1970-01-01
          • 2018-08-12
          相关资源
          最近更新 更多