输入一串不重复的字符串,列出所有可能的组合(java实现)

1、输入一串不重复的字符串,列出所有可能的组合

   例:输入字符串: abc

   输出:

   abc

   acb

   bac

   bca

   cab

   cba

分析:这是一道很好的考查对递归理解的编程题,我们以三个字符 abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符 bc的排列。当两个字符 bc的排列求好之后,我们把第一个字符a和后面的 b交换,得到 bac,接着我们固定第一个字符 b,求后面两个字符ac的排列。现在是把 c放到第一位臵的时候了。记住前面我们已经把原先的第一个字符 a和后面的b做了交换,为了保证这次 c 仍然是和原先处在第一位臵的a交换,我们在拿 c和第一个字符交换之前,先要把 b和a交换回来。在交换b和 a之后,再拿c和处在第一位臵的 a进行交换,得到 cba。我们再次固定第一个字符 c,求后面两个字符b、a的排列。 既然我们已经知道怎么求三个字符的排列,那么固定第一个字符之后求后面两个字符的排列,就是典型的递归思路了。 

实现:

public class Test2
{
 public static void main(String[] args)
 {
  char[] str ={ 'a', 'b', 'c'};
  Combination(str, 0, str.length);
 }

 public static void Combination(char[] pStr, int begin, int end)
 {
  // 只剩一个元素
  if (begin == end - 1)
  {
   // 打印
   for (int i = 0; i < end; i++) // 打印
   {
    System.out.print(pStr[i]);
   }
   System.out.println();
  } else
  {
   for (int k = begin; k < end; k++)
   {
    // 交换两个字符
    swap(pStr, k, begin);
    Combination(pStr, begin + 1, end);
    // 恢复
    swap(pStr, k, begin);
   }
  }
 }

 public static void swap(char[] str, int n, int m)
 {
  char temp = str[n];
  str[n] = str[m];
  str[m] = temp;
 }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值