基础测试中的一道题,思考好久才想出来,现在拿出来看看,题目如下:
列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如: 原始字符串是"abc",打印得到下列所有组合情况:"a" "b" "c" "ab" "bc" "ca" "ba" "cb" "ac""abc" "acb" "bac" "bca" "cab" "cba"
import java.io.*;
public class Text6 {
public static void main(String[] args) {
//调用自定义方法获取strLen长度的字符串的所以组合形式
allArray();
}
public static void allArray(){
//开启键盘录入
BufferedReader bufr=new BufferedReader(
new InputStreamReader(System.in));
String line=null;
//读取键盘录入的内容,并处理异常
try
{
line=bufr.readLine();
}
catch(IOException ie)
{
throw new RuntimeException("读取失败");
}
//将读取的字符串转换成字符数组
char[] cha=line.toCharArray();
//定义一个字符串缓冲区,一遍对遍历组合的字符串进行存储
StringBuffer sb=new StringBuffer();
//将字符串添加到字符串缓冲区,以完成setCharAt操作
sb.append(line);
//定义一个指针,完成字符串缓冲区内字符的修改
int count=0;
int strLen=cha.length;
//调用自定义方法获取字符串组合形式
getSome(cha,strLen,sb,count);
}
public static void getSome(char[] cha,int strLen,
StringBuffer sb,int count){
//采用递归的方式,在遍历数组的同时完成不同字符数的不同组合,
for(int x=0;x<cha.length;x++)
{
//更改指定Index的字符以完成相同字符数的不同组合
sb.setCharAt(count,cha[x]);
//字符串长度大于1时递归获取下一角标的字符
if(strLen>1)
{
//保证count在递推的循环完成后与之前相同
count++;
getSome(cha,strLen-1,sb,count);
count--;
}
//按照填入的字符数获取组合的字符串
String s=sb.substring(0,count+1);
//定义布尔型变量,用于判断字符数组中是否有相同元素
boolean flog=true;
//将字符串转换成字符数组
char[] ss=s.toCharArray();
//通过for嵌套判断该字符数组内是否有相同元素,并用flog记录
for(int z=0;z<ss.length;z++){
for(int m=z+1;m<ss.length;m++){
if(ss[z]==ss[m])
flog=false;
}
}
//如果没有,将字符数组转换成字符串并打印。
if(flog)
System.out.println(new String(ss,0,ss.length));
}
}
}