题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab、cba。
测试用例:
1)功能测试(输入的字符串中有1个或者多个字符);
2)特殊输入测试(输入的字符串的内容为空或者是null指针);
相关题目:
1)如果不是求字符的所有排列,而是求字符的所有组合,该怎么办。还是输入三个字符a、b、c,则它们的组合有a、b、c、ab、ac、bc、abc。当交换字符串中的两个字符时,虽然能得到两个不同的排列,但却是同一个组合。比如ab和ba是不同的排列,但只算一个组合。
2)输入一个含有8个数字的数组,判断有没有可能把这8个数字分别放到正方体的8个顶点上,使得正方体上三组相对的面上的4个顶点的和都相等。
3)在8*8的国际象棋上摆放8个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角线上。
思路:还是万年不变的递归!!!需要通过Debug来了解递归思想了。
代码实现:
package com.yyq;
import java.util.Arrays;
/**
* Created by Administrator on 2015/9/20.
*/
public class StringPermutation {
public static void permutation_1(char[] pStr){
if (pStr == null || pStr.length == 0)
return;
permutation_2(pStr, 0,pStr.length-1);
}
public static void permutation_2(char[] buf, int start, int end) {
if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
for (int i = 0; i <= end; i++) {
System.out.print(buf[i]);
}
System.out.println();
} else {// 多个字母全排列
for (int i = start; i <= end; i++) {
char temp = buf[start];// 交换数组第一个元素与后续的元素
buf[start] = buf[i];
buf[i] = temp;
permutation_2(buf, start + 1, end);// 后续元素递归全排列
temp = buf[start];// 将交换后的数组还原
buf[start] = buf[i];
buf[i] = temp;
}
}
}
// ====================测试代码====================
public static void Test(char[] pStr)
{
if(pStr == null)
System.out.println("Test for NULL begins:");
else
System.out.println("Test for " + Arrays.toString(pStr) + " begins:");
permutation_1(pStr);
System.out.println();
}
public static void main(String[] args){
Test(null);
String string01 = "";
char string1[] = string01.toCharArray();
Test(string1);
String string02 = "a";
char string2[] = string02.toCharArray();
Test(string2);
String string03 = "ab";
char string3[] = string03.toCharArray();
Test(string3);
String string04 = "abc";
char string4[] = string04.toCharArray();
Test(string4);
}
}
结果输出:
Test for NULL begins:
Test for [] begins:
Test for [a] begins:
a
Test for [a, b] begins:
ab
ba
Test for [a, b, c] begins:
abc
acb
bac
bca
cba
cab