1:剑指offer, 通过递归,遍历到最底层开始打印。
package com.li.String; /** * @program: GradleTestUseSubModule * @author: Yafei Li * @create: 2018-07-21 15:49 * Java 中,怎么打印出一个字符串的所有排列 **/ public class PrintStringSort { public static void main(String[] args){ String str="abcd"; char[] chars = str.toCharArray(); int low=0; for (int i = 0; i <chars.length; i++) { char temp = chars[i]; chars[i]=chars[0]; chars[0]=temp; print(chars,low); } } private static void print(char[] chars, int low) { if (low == chars.length-1) { for (int i = 0; i < chars.length; i++) { System.out.print(chars[i]); } System.out.println(""); } for (int i = low+1; i < chars.length; i++) { char temp=chars[i]; chars[i] = chars[low+1]; chars[low+1]=temp; print(chars,low + 1); char temp1=chars[i]; chars[i] = chars[low+1]; chars[low+1]=temp1; } } }
结果:从后往前改变
abcd
abdc
acbd
acdb
adcb
adbc
bacd
badc
bcad
bcda
bdca
bdac
cabd
cadb
cbad
cbda
cdba
cdab
dabc
dacb
dbac
dbca
dcba
dcab
2: 打印一个字符串的字典排序,前面n个数相同,后面n个数相同,网易考试题。
package com.li.wangYi; import java.util.LinkedHashSet; import java.util.Set; /** * @program: GradleTestUseSubModule * @author: Yafei Li * @create: 2018-07-21 15:49 * Java 中,怎么打印出一个字符串的所有排列 **/ public class Ques3 { static Set<String> set = new LinkedHashSet<>(); public static void main(String[] args){ String str="aaazzz"; char[] chars = str.toCharArray(); int low=0; for (int i = 0; i <chars.length; i++) { char temp = chars[i]; chars[i]=chars[0]; chars[0]=temp; print(chars,low); } for (String s : set) { System.out.println(s); } } private static void print(char[] chars, int low) { StringBuffer stringBuffer = new StringBuffer(); for (int i = 0; i < chars.length; i++) { stringBuffer.append(chars[i]); } set.add(stringBuffer.toString()); stringBuffer=null; for (int i = low+1; i < chars.length; i++) { char temp=chars[i]; chars[i] = chars[low+1]; chars[low+1]=temp; print(chars,low + 1); char temp1=chars[i]; chars[i] = chars[low+1]; chars[low+1]=temp1; } } }
打印出aaazzz的字典顺序字符串,结果,从前往后改变。
aaazzz
aazazz
aazzaz
aazzza
azaazz
azazaz
azazza
azzaaz
azzaza
azzzaa
zaaazz
zaazaz
zaazza
zazaaz
zazaza
zazzaa
zzaaaz
zzaaza
zzazaa
zzzaaa
3:打印字符串的所有排列
package com.li.zhongxing; import java.io.InputStream; import java.util.Scanner; /** * a f g h b 能组成的含有3个字符的不同的组合的个数。 */ public class Main2 { public static void main(String[] args){ Main2 main1=new Main2(); Class clazz = main1.getClass(); InputStream Systemin = clazz.getResourceAsStream("/zhongxing/data2.txt"); Scanner scanner = new Scanner(Systemin); char[] chars = {'a', 'd', 'r'}; int index=0; // for (int j = 0; j < chars.length; j++) { // swap(chars,0, j); recursive(chars,index); // } } private static void swap(char[] chars,int i, int j) { char temp = chars[i]; chars[i] = chars[j]; chars[j]=temp; } private static void recursive(char[] chars,int index){ if (index == 3) { for (int i = 0; i < 3; i++) { System.out.print(chars[i]); } System.out.println(""); return; } for (int i = index; i < chars.length; i++) { char temp = chars[i]; chars[i]=chars[index]; chars[index]=temp; recursive(chars,index+1); char temp1 = chars[i]; chars[i]=chars[index]; chars[index]=temp1; } } }
结果:
adr
ard
dar
dra
rda
rad