首先我们拿到题目,应该考虑到是在考察字符串的全部排列。
思路:第一步:我们可以先将字符串分为两部分,第一个字符和后面的字符
第二步:我们求出所有可能出现在第一个位置的字符,然后再和后面的字符交换,相同的不用换
第三步:固定第一个字符,然后求后面字符的排列,至于后面字符的排列,我们可以看作再次固定第一个字符,以此类推,用递归可以简单快速的解决这个问题
我们以abc来举例:

测试代码:
public static void main(String[] args) {
System.out.println("请输入字符串:");
String str = "";
Scanner scan = new Scanner(System.in);
str = scan.nextLine();
printall(str);
System.out.println(printall(str));
}
private static ArrayList<String> printall(String str) {
ArrayList<String> result = new ArrayList<>();
if (str == null || str.length() == 0){
return result;
}
char[] chars = str.toCharArray();
//按字典顺序输出
TreeSet<String> temp = new TreeSet<>();
printallstr(chars,temp,0);
result.addAll(temp);
return result;
}
private static void printallstr(char[] chars, TreeSet<String> temp, int index) {
if (chars == null || chars.length == 0 || index < 0 || index > chars.length){
return;
}
if (index == chars.length-1){
//递归的结束
temp.add(String.valueOf(chars));
}else {
for (int i = index;i < chars.length;i++){
//把第一个字符和后面的字符交换
swap(chars,i,index);
//对后面的所有字符进行全排列
printallstr(chars,temp,index+1);
//把第一个字符再换回来,方便再与其他字符交换
swap(chars,i,index);
}
}
}
private static void swap(char[] chars, int i, int index) {
char temp = chars[i];
chars[i] = chars[index];
chars[index] = temp;
}
运行结果:
请输入字符串:
abc
[abc, acb, bac, bca, cab, cba]
博客介绍了求解字符串排列问题的思路,先将字符串分为首字符和后续字符两部分,求出首字符所有可能情况并与后续字符交换,固定首字符后递归求后续字符排列,还以abc为例进行说明。
516

被折叠的 条评论
为什么被折叠?



