1. 程式人生 > >輸入一串不重複的字串,列出所有可能的組合(java實現)

輸入一串不重複的字串,列出所有可能的組合(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;
 }
}