1 ,全排列
方法一 交换法
最好的优化(看核心代码就好)
package algorithm_text;
import java.util.Scanner;
//2021年1月28日下午9:38:58
//writer:apple
public class permu {
static int n;
static int a[]=new int [100];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();
for(int i=1;i<=n;i++)
{
a[i]=i;
}
perm(1,n);
}
public static void perm(int start,int end)
{
if(start==end)
{
for(int i=1;i<=n;i++)
{
System.out.print(" "+a[i]);
}
System.out.println();
}
else {
for(int i=start;i<=end;i++)
{
swap(start,i);
perm(start+1, end);
swap(start,i);
}
}
}
public static void swap(int i,int j)
{
int t =a[i];
a[i]=a[j];
a[j]=t;
}
}
----交换法应对有重复数据
public class 交换法去重 {
public static void main(String[] args) {
// TODO Auto-generated method stub
char a[]= {
'1','2','2','3'};
perm(a,0);
}
private static void perm(char[] a,int star) {
// TODO Auto-generated method stub
if(star==a.length)
{
System.out.println(a);
}
else {
int mark[]=new int[10000];
for(int i=star;i<a.length;i++)
{
if(mark[a[i]]==1) continue;
mark[a[i]]=1;
swap(a,star,i);
perm(a,star+1);
swap(a,star,i);
}
}
}
private static void swap(char[] a, int star, int i) {
// TODO Auto-generated method stub
char temp=a[star];
a[star]=a[i];
a[i]=temp;
}
}
其实还可以使用dfs递归哦~
import java.util.Scanner;
//2021年1月28日下午10:08:01
//writer:apple
public class dfsperm {
static int n;
static int a[]=new int[100];
static int vis[]=new int [100];
static int ans[]=new int [100];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();
for(int i=1;i<=n;i++)
{
a[i]=i;
}
dfs(1);
}
public static void dfs(int step)
{
if(step==n+1)
{
for(int j=1;j<=n;j++)
{
System.out.print(" "+ans[j]);
}
System.out.println();
}
for(int j=1;j<=n;j++)
{
if(vis[j]==1) continue;
else {
vis[j]=1;
ans[step]=j;
dfs(step+1);
vis[j]=0;
}
}
}
}
方法二 前缀法
public class 前缀法 {
static int count;
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="1234";
perm("",str);
}
public static void perm(String pre,String str)
{
if(pre.length()==str.length()) System.out.println(pre);
for(int i=0;i<str.length();i++)
{
char t=str.charAt(i);
if(cnt(pre,t)<cnt(str,t)) perm(pre+t, str);
}
}
public static int cnt(String str,char t)
{
int c=0;
for(int i=0;i<str.length()