题目:输入一个字符串,打印该字符串中字符的所有排列。例如输入abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba六种。
分析:该题可以使用递归的方法解决。先可以创建一个集合类用于保存结果,同时创建一个集合类用于保存中间的临时结果。对于字符串我们先从头到尾访问字符串中的每个元素,对于访问到的元素,我们先在字符串中删除该元素,并把该元素加入到临时结果中去,然后使用删除后的字符串和临时结果继续访问删除和添加,直到最终该字符串的长度为0时才将所得到的临时结果放入到结果的集合类中去,这过程中用到了递归思想。
代码如下:
/**
*
*/
package problem2;
import java.util.ArrayList;
import java.util.List;
/**
* @author Hutongling
*
* @time:2017年3月22日 下午8:54:50
*/
public class 字符串的排列 {
/**
* @param base 以该字符串作为基础字符串,进行选择性组合。
* @param buff 所求字符串的临时结果
* @param result 存放所求结果
*/
public static List<String> list(String base,String buff){
List<String> result = new ArrayList<String>();//存放结果信息。
if(base.length()<=0)
result.add(buff);
for(int i=0;i<base.length();i++){
List<String> temp = list(new StringBuffer(base).deleteCharAt(i).toString(),buff+base.charAt(i));
result.addAll(temp);
}
return result;
}
public static void main(String[] args) {
String s = "ABCD";// 原字符串
if (s == null || s.length() == 0)
System.out.println("请输入字符串");
else {
List<String> result = list(s, "");// 列出字符的组合,放入result
System.out.print("一共有"+result.size()+"种情况:");
System.out.println(result);
}
}
}
代码结果:
一共有24种情况:[ABCD, ABDC, ACBD, ACDB, ADBC, ADCB, BACD, BADC, BCAD, BCDA, BDAC, BDCA, CABD, CADB, CBAD, CBDA, CDAB, CDBA, DABC, DACB, DBAC, DBCA, DCAB, DCBA]