• 打印字符串的所有排列


    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
  • 相关阅读:
    LOJ3160 「NOI2019」斗主地
    常系数齐次线性递推
    最小树形图——朱刘算法学习小记
    Linux系统分区(一)
    Linux系统启动过程(二)
    Linux系统目录结构(三)
    cross_val_score
    sklearn.pipeline.Pileline
    DBSCAN密度聚类算法
    特征选择
  • 原文地址:https://www.cnblogs.com/liyafei/p/9460766.html
Copyright © 2020-2023  润新知