• 字符串排列组合1


    问题1 :输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符abc所能排列出来的所有字符串abcacbbacbcacabcba

       分析:可通过递归求解。递归算法的四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环;(2)子问题在规模上比原问题小;(3)子问题可通过再次递归调用求解;(4)子问题的解应能组合成整个问题的解。下面这个图很清楚的给出了递归的过程:

        代码实现如下:

                      

     1 //函数功能 : 求一个字符串某个区间内字符的全排列
     2 //函数参数 : pStr为字符串,begin和end表示区间
     3 //返回值 :   无
     4 void Permutation(char *pStr, int begin, int end)
     5 {
     6     if(begin == end - 1) //只剩一个元素
     7     {
     8         for(int i = 0; i < end; i++) //打印
     9             cout<<pStr[i];
    10         cout<<endl;
    11     }
    12     else
    13     {
    14         for(int k = begin; k < end; k++)
    15         {
    16             swap(pStr[k], pStr[begin]); //交换两个字符
    17             Permutation(pStr, begin + 1, end); //迭代
    18             swap(pStr[k],pStr[begin]);  //恢复
    19         }
    20     }
    21 

    问题2:算法题:用你熟悉的编程语言,设计如下功能的函数:输入一个字符串,输出该字符串中所有字母的全排列。程序请适当添加注释。
    C++函数原型:void Print(const char *str)
    输入样例:abc
    输出结果:abc、acb、bca、bac、cab、cba

    分析:这个问题与上面问题1基本上是相同的,唯一不同的是这里要求函数的输入参数为const char*,所以不能直接进行操作,解决方法是重新定义一个辅助函数,用拷贝后的数组变化作为参数传入。
    代码如下所示:
     1  #include <iostream>
     2  using namespace std;
     3  
     4  static int count = 0;
     5  
     6  void permut(char* a, int start, int end)
     7  {
     8      if(start >= end)
     9      {
    10          ++count;
    11          cout << a << endl;
    12      }
    13      else
    14      {
    15          for(int i = start; i <= end; ++i)
    16          {
    17              swap(a[i], a[start]);
    18              permut(a, start + 1, end);
    19              swap(a[i], a[start]);
    20          }
    21      }
    22  }
    23  
    24  
    25  void Print(const char* str)
    26  {
    27      int len = strlen(str);
    28      char *p = new char[len + 1];
    29      strncpy(p, str, len);
    30      p[len] = '\0';
    31      permut(p, 0, len - 1);
    32      delete [] p;
    33  }
    34  
    35  int main()
    36  {
    37    
    38 Print("abcd"); 39 cout << endl << "总共有 " << count << "" << endl; 40 return 0; 41 }
  • 相关阅读:
    Hamler 0.2 正式发布
    Xamarin.Forms 解决ListView高度问题
    Xamarin.Forms中DependencyService的使用
    Xamarin.Forms Android 底部导航栏
    修改UITabBar样式 TintColor 和 Selected Tab Images in Xamarin.Forms iOS
    Xamarin.iOS中使用MvvmLight框架
    Xamarin.iOS 代码中添加约束练习
    Xamarin.Android 手势密码
    UWP 手势密码实现
    Xamarin.iOS 手势密码
  • 原文地址:https://www.cnblogs.com/Trony/p/2621093.html
Copyright © 2020-2023  润新知