遇到一个难题,你知道如何显示出我输入的字母的所有排列组合吗?例如:我输入 ABC 它就会显示ABC
ACB
BAC
BCA
CAB
CBA    据说是使用递归,但是我没有想到办法 
  

解决方案 »

  1.   

    public class PermABC {
    public static void main(String []args) {
    /*
    if (args.length == 0) {
    System.out.println("error");
    } else {
    char[] arr = args.toCharArray();

    perm(arr,0,23);
    }
    */

    String str = "abc";
    //System.out.println(str.length());
    char[] arr = str.toCharArray();
    perm(arr,0,str.length());
    }


    static void perm(char[] list,int k,int m) {
       int i;
       if (k == m) {
           
           for(i=0; i<m; i++)
               System.out.print(list[i]);
           System.out.println("");
           
       } else {
           
           for(i=k; i<m; i++) {
                swap(list, k, i);
                perm(list, k + 1, m);
                swap(list, k, i);
           }
        }
    } static void swap(char[] arr, int i, int k){
         char temp;
         temp = arr[i];
         arr[i] = arr[k];
         arr[k] = temp;
    }
    }
      

  2.   

    这道题用动态规划的思想应该可以解决~~具体的思想是怎样的,你找找说算法的书吧,里面有说~~或者你看看strassen算法的思想也可以~
      

  3.   

    有点乱.不要介意
    package com.test;import java.util.Date;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;public class TestMyArray {
    private int[] in;
    private Set<String> set; public TestMyArray(int l) {
    int[] sin =  {1 , 2 , 2 , 3 , 4 , 5};
    set = new HashSet<String>() ;
    in = sin; } public void getlist() {
    int langth = in.length;
    list(langth, langth);
    Iterator it = set.iterator();
    while(it.hasNext()){
    System.out.println(it.next());
    }
    System.out.println(set.size()); } public void list(int length, int alllangth) {
    if (length == 1) {
    // print();
    return;
    }
    if (length == 2) {
    checkprint();
    if(changpn(alllangth - length, alllangth))
    checkprint();
    return;
    } for (int i = 0; i < length; i++) {
    list(length - 1, alllangth);
    changpn(alllangth - length, alllangth);
    }
    }
    public void checkprint(){
    print();

    }
    public void print() {
    StringBuffer bu = new StringBuffer() ;
    for (int i = 0; i < in.length; i++)
    bu.append(in[i]) ;
    set.add(bu.toString()) ;
    } public boolean changpn(int index, int alllangth) {
    int st = index + 1;
    for(int i = st ; i < alllangth ; i ++ ){
    for(int j = i + 1; j < alllangth ; j ++){
    if(in[i] > in[j]){
    int va = in[i];
    in[i] = in[j] ;
    in[j] = va ;
    }
    }
    }
    int temp;
    for (temp = index + 1; temp < alllangth; temp++) {
    if (in[index] < in[temp]) {
    int v = in[index];
    in[index] = in[temp];
    in[temp] = v;
    break;
    }
    }
    if(temp == alllangth) return false ;
    return true;
    } public static void main(String[] args) {
    TestMyArray tt = new TestMyArray(5);
    long o = new Date().getTime();
    tt.getlist();
    long n = new Date().getTime();
    System.out.println(n - o);
    }
    }
      

  4.   

    我的程序,按照递归算法弄,但显示花了我不少时间,结果却很简单。如下:
    import java.util.*;
    public class test {
    public static void main(String[] arg) {
    Scanner r=new Scanner(System.in);
    String s=r.nextLine();
    Pailie(s,"");
    }
    static void Pailie(String s, String p) {
    if(s.length()<1) System.out.println(p+s);
    else {
    for(int i=0; i<s.length(); i++) {
    Pailie(s.substring(1),p+s.substring(0,1));
    s=s.substring(1)+s.substring(0,1);
    }
    }
    }
    }
    结果:
    ABC(这是输入行)
    ABC
    ACB
    BCA
    BAC
    CAB
    CBA
      

  5.   

    不用递归的算法:
    public class Test 
    {
     
      public static void main(String args[])
    {
      char[] a={'a','b','c','d'};
          char[] b={'a','b','c','d'};
          char temp;
          for(int j=0;j<a.length;j++)
      {
      for (int i=a.length-1;i>0 ;i-- )
      {
      temp=a[i-1];
          a[i-1]=a[i];
          a[i]=temp;
          if (a!=b)
      {
      System.out.println(a);
      }
      }
          } 
      }
    }