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