我先了半天,没想出来,估计是俺太菜了,不知道哪位高人能给个用简单的数据结构实现的递归求全排列的程序。
另外我自己想了一个算法:把字符串变成对应的字符数组,然后两个for循环这个数组,交换每两个字符的位置,从而产生一个新的不一样的数组,再把这个数组传给String的构造函数,从而实现全排列的目的。import java.util.*;public class StringExchangeChar {
public static Vector exchangeChar (String str){
Vector<String> vector = new Vector<String> ();
vector.add(str);

char[] charArray = str.toCharArray();

for (int i=0; i<str.length(); i++){
for (int j=0; j<str.length(); j++){
if (i != j){
char temp = charArray[j];
charArray[j] = charArray[i];
charArray[i] = temp;

String tempString = new String (charArray);

for (int k=0; k<vector.size(); k++){
if (tempString.equals(vector.get(k))){
break;
}
else if (!(tempString.equals(vector.get(k))) && k == vector.size()-1){
vector.add(tempString);
}
}
}
}
}
return vector;
}
public static void main (String args[]){
String str = "abc";

Vector stringVector = new Vector();
stringVector = exchangeChar(str);
System.out.println("一共有"+ stringVector.size() +"种全排列。分别是:");

Iterator iterator = stringVector.iterator();

while (iterator.hasNext()){
System.out.print(iterator.next() +" ");
}
}
}
一共有5种全排列。分别是:
abc bac cab acb cba 后来看到解果,我才明白这个算法是有缺陷的。没法完全输出全排列...谁给我改进下,还是这个算法就不能实现这个功能?

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【justinavril】截止到2008-08-01 23:12:29的历史汇总数据(不包括此帖):
    发帖的总数量:11                       发帖的总分数:530                      每贴平均分数:48                       
    回帖的总数量:133                      得分贴总数量:36                       回帖的得分率:27%                      
    结贴的总数量:11                       结贴的总分数:530                      
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    敬礼!

    取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=justinavril
      

  2.   

    我自己写了一个,可以参考一下:public class Test{
        public static void main(String[] args) {
            char buf[]={'a','b','c','d'};
            perm(buf,0,buf.length-1);
        }
        public static void perm(char[] buf,int start,int end){
            if(start==end){
                for(int i=0;i<=end;i++){
                    System.out.print(buf[i]+" ");
                }
                System.out.println();
            }
            else{
                for(int i=start;i<=end;i++){
                    char temp=buf[start];
                    buf[start]=buf[i];
                    buf[i]=temp;
                    perm(buf,start+1,end);
                    temp=buf[start];
                    buf[start]=buf[i];
                    buf[i]=temp;
                }
            }
        }
    }
      

  3.   

    关于全排列生成,这篇文章很经典http://oldtech.lupaworld.com/view.php?tid-9740-cid-34.html
      

  4.   

    那篇文章是用Python写的  感觉Python很灵活啊  语法很不懂...而且解释的也不是很清晰吧
    其实有个O(n)的算法  很简短  更是看不懂啊  
      

  5.   

    谢谢2#的代码,收藏了。   就是不知道我的代码错在了哪里?有没有不是递归实现的?
    另外我把2#的代码加了注释  应该没问题吧public class AllSort{
        public static void main(String[] args) {
            char buf[]={'a','b','c','d','e','g'};        perm(buf,0,buf.length-1);
        }
        public static void perm(char[] buf,int start,int end){
            if(start==end){//当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
                for(int i=0;i<=end;i++){
                    System.out.print(buf[i]);
                }
                System.out.println();
            }
            else{//多个字母全排列
                for(int i=start;i<=end;i++){
                    char temp=buf[start];//交换数组第一个元素与后续的元素
                    buf[start]=buf[i];
                    buf[i]=temp;
                    
                    perm(buf,start+1,end);//后续元素递归全排列
                    
                    temp=buf[start];//将交换后的数组还原
                    buf[start]=buf[i];
                    buf[i]=temp;
                }
            }
        }
    }
    abcdeg
    abcdge
    abcedg
    abcegd
    abcged
    abcgde
    abdceg
    abdcge
    abdecg
    abdegc
    abdgec
    abdgce
    abedcg
    abedgc
    abecdg
    abecgd
    abegcd
    abegdc
    abgdec
    abgdce
    abgedc
    abgecd
    abgced
    abgcde
    acbdeg
    acbdge
    acbedg
    acbegd
    acbged
    acbgde
    acdbeg
    acdbge
    acdebg
    acdegb
    acdgeb
    acdgbe
    acedbg
    acedgb
    acebdg
    acebgd
    acegbd
    acegdb
    acgdeb
    acgdbe
    acgedb
    acgebd
    acgbed
    acgbde
    adcbeg
    adcbge
    adcebg
    adcegb
    adcgeb
    adcgbe
    adbceg
    adbcge
    adbecg
    adbegc
    adbgec
    adbgce
    adebcg
    adebgc
    adecbg
    adecgb
    adegcb
    adegbc
    adgbec
    adgbce
    adgebc
    adgecb
    adgceb
    adgcbe
    aecdbg
    aecdgb
    aecbdg
    aecbgd
    aecgbd
    aecgdb
    aedcbg
    aedcgb
    aedbcg
    aedbgc
    aedgbc
    aedgcb
    aebdcg
    aebdgc
    aebcdg
    aebcgd
    aebgcd
    aebgdc
    aegdbc
    aegdcb
    aegbdc
    aegbcd
    aegcbd
    aegcdb
    agcdeb
    agcdbe
    agcedb
    agcebd
    agcbed
    agcbde
    agdceb
    agdcbe
    agdecb
    agdebc
    agdbec
    agdbce
    agedcb
    agedbc
    agecdb
    agecbd
    agebcd
    agebdc
    agbdec
    agbdce
    agbedc
    agbecd
    agbced
    agbcde
    bacdeg
    bacdge
    bacedg
    bacegd
    bacged
    bacgde
    badceg
    badcge
    badecg
    badegc
    badgec
    badgce
    baedcg
    baedgc
    baecdg
    baecgd
    baegcd
    baegdc
    bagdec
    bagdce
    bagedc
    bagecd
    bagced
    bagcde
    bcadeg
    bcadge
    bcaedg
    bcaegd
    bcaged
    bcagde
    bcdaeg
    bcdage
    bcdeag
    bcdega
    bcdgea
    bcdgae
    bcedag
    bcedga
    bceadg
    bceagd
    bcegad
    bcegda
    bcgdea
    bcgdae
    bcgeda
    bcgead
    bcgaed
    bcgade
    bdcaeg
    bdcage
    bdceag
    bdcega
    bdcgea
    bdcgae
    bdaceg
    bdacge
    bdaecg
    bdaegc
    bdagec
    bdagce
    bdeacg
    bdeagc
    bdecag
    bdecga
    bdegca
    bdegac
    bdgaec
    bdgace
    bdgeac
    bdgeca
    bdgcea
    bdgcae
    becdag
    becdga
    becadg
    becagd
    becgad
    becgda
    bedcag
    bedcga
    bedacg
    bedagc
    bedgac
    bedgca
    beadcg
    beadgc
    beacdg
    beacgd
    beagcd
    beagdc
    begdac
    begdca
    begadc
    begacd
    begcad
    begcda
    bgcdea
    bgcdae
    bgceda
    bgcead
    bgcaed
    bgcade
    bgdcea
    bgdcae
    bgdeca
    bgdeac
    bgdaec
    bgdace
    bgedca
    bgedac
    bgecda
    bgecad
    bgeacd
    bgeadc
    bgadec
    bgadce
    bgaedc
    bgaecd
    bgaced
    bgacde
    cbadeg
    cbadge
    cbaedg
    cbaegd
    cbaged
    cbagde
    cbdaeg
    cbdage
    cbdeag
    cbdega
    cbdgea
    cbdgae
    cbedag
    cbedga
    cbeadg
    cbeagd
    cbegad
    cbegda
    cbgdea
    cbgdae
    cbgeda
    cbgead
    cbgaed
    cbgade
    cabdeg
    cabdge
    cabedg
    cabegd
    cabged
    cabgde
    cadbeg
    cadbge
    cadebg
    cadegb
    cadgeb
    cadgbe
    caedbg
    caedgb
    caebdg
    caebgd
    caegbd
    caegdb
    cagdeb
    cagdbe
    cagedb
    cagebd
    cagbed
    cagbde
    cdabeg
    cdabge
    cdaebg
    cdaegb
    cdageb
    cdagbe
    cdbaeg
    cdbage
    cdbeag
    cdbega
    cdbgea
    cdbgae
    cdebag
    cdebga
    cdeabg
    cdeagb
    cdegab
    cdegba
    cdgbea
    cdgbae
    cdgeba
    cdgeab
    cdgaeb
    cdgabe
    ceadbg
    ceadgb
    ceabdg
    ceabgd
    ceagbd
    ceagdb
    cedabg
    cedagb
    cedbag
    cedbga
    cedgba
    cedgab
    cebdag
    cebdga
    cebadg
    cebagd
    cebgad
    cebgda
    cegdba
    cegdab
    cegbda
    cegbad
    cegabd
    cegadb
    cgadeb
    cgadbe
    cgaedb
    cgaebd
    cgabed
    cgabde
    cgdaeb
    cgdabe
    cgdeab
    cgdeba
    cgdbea
    cgdbae
    cgedab
    cgedba
    cgeadb
    cgeabd
    cgebad
    cgebda
    cgbdea
    cgbdae
    cgbeda
    cgbead
    cgbaed
    cgbade
    dbcaeg
    dbcage
    dbceag
    dbcega
    dbcgea
    dbcgae
    dbaceg
    dbacge
    dbaecg
    dbaegc
    dbagec
    dbagce
    dbeacg
    dbeagc
    dbecag
    dbecga
    dbegca
    dbegac
    dbgaec
    dbgace
    dbgeac
    dbgeca
    dbgcea
    dbgcae
    dcbaeg
    dcbage
    dcbeag
    dcbega
    dcbgea
    dcbgae
    dcabeg
    dcabge
    dcaebg
    dcaegb
    dcageb
    dcagbe
    dceabg
    dceagb
    dcebag
    dcebga
    dcegba
    dcegab
    dcgaeb
    dcgabe
    dcgeab
    dcgeba
    dcgbea
    dcgbae
    dacbeg
    dacbge
    dacebg
    dacegb
    dacgeb
    dacgbe
    dabceg
    dabcge
    dabecg
    dabegc
    dabgec
    dabgce
    daebcg
    daebgc
    daecbg
    daecgb
    daegcb
    daegbc
    dagbec
    dagbce
    dagebc
    dagecb
    dagceb
    dagcbe
    decabg
    decagb
    decbag
    decbga
    decgba
    decgab
    deacbg
    deacgb
    deabcg
    deabgc
    deagbc
    deagcb
    debacg
    debagc
    debcag
    debcga
    debgca
    debgac
    degabc
    degacb
    degbac
    degbca
    degcba
    degcab
    dgcaeb
    dgcabe
    dgceab
    dgceba
    dgcbea
    dgcbae
    dgaceb
    dgacbe
    dgaecb
    dgaebc
    dgabec
    dgabce
    dgeacb
    dgeabc
    dgecab
    dgecba
    dgebca
    dgebac
    dgbaec
    dgbace
    dgbeac
    dgbeca
    dgbcea
    dgbcae
    ebcdag
    ebcdga
    ebcadg
    ebcagd
    ebcgad
    ebcgda
    ebdcag
    ebdcga
    ebdacg
    ebdagc
    ebdgac
    ebdgca
    ebadcg
    ebadgc
    ebacdg
    ebacgd
    ebagcd
    ebagdc
    ebgdac
    ebgdca
    ebgadc
    ebgacd
    ebgcad
    ebgcda
    ecbdag
    ecbdga
    ecbadg
    ecbagd
    ecbgad
    ecbgda
    ecdbag
    ecdbga
    ecdabg
    ecdagb
    ecdgab
    ecdgba
    ecadbg
    ecadgb
    ecabdg
    ecabgd
    ecagbd
    ecagdb
    ecgdab
    ecgdba
    ecgadb
    ecgabd
    ecgbad
    ecgbda
    edcbag
    edcbga
    edcabg
    edcagb
    edcgab
    edcgba
    edbcag
    edbcga
    edbacg
    edbagc
    edbgac
    edbgca
    edabcg
    edabgc
    edacbg
    edacgb
    edagcb
    edagbc
    edgbac
    edgbca
    edgabc
    edgacb
    edgcab
    edgcba
    eacdbg
    eacdgb
    eacbdg
    eacbgd
    eacgbd
    eacgdb
    eadcbg
    eadcgb
    eadbcg
    eadbgc
    eadgbc
    eadgcb
    eabdcg
    eabdgc
    eabcdg
    eabcgd
    eabgcd
    eabgdc
    eagdbc
    eagdcb
    eagbdc
    eagbcd
    eagcbd
    eagcdb
    egcdab
    egcdba
    egcadb
    egcabd
    egcbad
    egcbda
    egdcab
    egdcba
    egdacb
    egdabc
    egdbac
    egdbca
    egadcb
    egadbc
    egacdb
    egacbd
    egabcd
    egabdc
    egbdac
    egbdca
    egbadc
    egbacd
    egbcad
    egbcda
    gbcdea
    gbcdae
    gbceda
    gbcead
    gbcaed
    gbcade
    gbdcea
    gbdcae
    gbdeca
    gbdeac
    gbdaec
    gbdace
    gbedca
    gbedac
    gbecda
    gbecad
    gbeacd
    gbeadc
    gbadec
    gbadce
    gbaedc
    gbaecd
    gbaced
    gbacde
    gcbdea
    gcbdae
    gcbeda
    gcbead
    gcbaed
    gcbade
    gcdbea
    gcdbae
    gcdeba
    gcdeab
    gcdaeb
    gcdabe
    gcedba
    gcedab
    gcebda
    gcebad
    gceabd
    gceadb
    gcadeb
    gcadbe
    gcaedb
    gcaebd
    gcabed
    gcabde
    gdcbea
    gdcbae
    gdceba
    gdceab
    gdcaeb
    gdcabe
    gdbcea
    gdbcae
    gdbeca
    gdbeac
    gdbaec
    gdbace
    gdebca
    gdebac
    gdecba
    gdecab
    gdeacb
    gdeabc
    gdabec
    gdabce
    gdaebc
    gdaecb
    gdaceb
    gdacbe
    gecdba
    gecdab
    gecbda
    gecbad
    gecabd
    gecadb
    gedcba
    gedcab
    gedbca
    gedbac
    gedabc
    gedacb
    gebdca
    gebdac
    gebcda
    gebcad
    gebacd
    gebadc
    geadbc
    geadcb
    geabdc
    geabcd
    geacbd
    geacdb
    gacdeb
    gacdbe
    gacedb
    gacebd
    gacbed
    gacbde
    gadceb
    gadcbe
    gadecb
    gadebc
    gadbec
    gadbce
    gaedcb
    gaedbc
    gaecdb
    gaecbd
    gaebcd
    gaebdc
    gabdec
    gabdce
    gabedc
    gabecd
    gabced
    gabcde
      

  6.   

    您这个算法从逻辑上没有保证所有新字符串里字母两两交换,而且字母数越多则缺少的组合越多第一个循环,abc,j=1时不等于i=0,因此交换ab,产生新的字符串bac,加入vector,这时charArray已经变成了
    bac,因此j=2时交换bc,产生cab,加入vector。第二个循环,cab,j=0时不等于i=1,交换ca,产生acb,加入vector,j=2时交换cb,产生abc,重复,不加入vector,这里算法就有冗余了,chaArray变回abc第三个循环,abc,j=0时不等于i=2,交换ac,产生cba,加入vector,j=1时交换cb,产生cab,重复,不加入vector,又重复一次循环结束,vector里面就是abc,bac,cab,acb,cba如果按这个思路修改,只能把所有新产生字符串都做全字符交换,比如第一个产生的bac,就要再交换ac。。否则你的算法从逻辑上也最多只能出现str.lenth平方的组合数,也就是说4字符串最多只有16种,5字符串最多只有25种,远远少于实际的全排列数字。
      

  7.   

    本帖最后由 AWUSOFT 于 2008-08-05 00:46:55 编辑
      

  8.   

    void execute(int *x , int n, DWORD &d)
    {
    //char s[] = "abcdefghijklmnopqrstuvwxyz0123456789";
    for(int i=1;i<=n;i++)
    printf("%c",s[x[i]-1]);
    printf("\n");
    d++;
    }
    void makepass(int n,int r)
    {
    DWORD d=0;
    int *p = new int[r+1];
    int i , end = 0;
    for(i = 1; i<=r; i++)
    p[i]=1;
    execute(p,r,d);
    d++;
    while(!end)
    {
    p[r]++;
    for(i=r;i>0;i--)
    if(p[i]==n+1)
    {
    p[i] = 1;
    p[i-1]++;
    }
    execute(p,r,d);
    d++;
    end =1;
    for(i=r;i>0;i--)
    if(p[i]!=n)
    {
    end=0;
    break;
    }

    }
    printf("%d",d);
    }非递归的~~~~~~~~~~~~~~~可自定宽度和密码位数