全排列:
输入一个包含n个字符的字符串,输出该字符串的全排列。
样例输入:
abc
ab
样例输出:
abc
acb
bac
bca
cab
cba
ab
ba
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void permutation(char[]arr,char[] res,int[]visited,int cursor){
if(cursor==arr.length){
for(char c:res)
System.out.print(c);
System.out.println();
return;
}
for(int i=0;i<arr.length;i++){
if(visited[i]==0){
res[cursor]=arr[i];
visited[i]=1;
permutation(arr,res,visited,cursor+1);
visited[i]=0;
}
}
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext())
{
String s=scanner.nextLine();
char[] arr=s.toCharArray();
char[] res=new char[arr.length];
int[] visited=new int[arr.length];
Arrays.fill(visited, 0);
permutation(arr,res,visited,0);
}
scanner.close();
}
}
枚举子集:
输入一个包含n个字符的字符串,输出该字符串的所有可能的子集。
样例输入:
abc
样例输出:
a
ab
abc
ac
b
bc
c
import java.util.Scanner;
public class Main {
public static void subset(char[]arr,char[] res,int cursor,int index){
for(int i=0;i<cursor;i++){
System.out.print(res[i]);
}
System.out.println();
for(int i=index;i<arr.length;i++){
res[cursor]=arr[i];
index=i+1;
subset(arr,res,cursor+1,index);
}
}
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext())
{
String s=scanner.nextLine();
char[] arr=s.toCharArray();
char[] res=new char[arr.length];
subset(arr,res,0,0);
}
scanner.close();
}
}
枚举子集的二进制算法:
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext())
{
String s=scanner.nextLine();
char[] arr=s.toCharArray();
int n=arr.length;
for(int i=0;i<(1<<n);i++){
for(int j=0;j<n;j++){
if((i&(1<<j))!=0){
System.out.print(arr[j]);
}
}
System.out.println();
}
}
scanner.close();
}
}