zoukankan      html  css  js  c++  java
  • 打印字符串的所有排列

    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
  • 相关阅读:
    手指抽搐强迫症 之 APM病理分析器 v0.0.0.3 (11月24日更新)
    [转帖]修改MySql密码及访问限制设置详解
    C#学习笔记
    CodeSmith快速向导
    奇葩的maxscript
    MASM中可以定义的变量类型
    js琐记
    史上最全的css hack(ie69,firefox,chrome,opera,safari)
    逆向win32程序的思路琐记
    makefile伪目标
  • 原文地址:https://www.cnblogs.com/liyafei/p/9460766.html
Copyright © 2011-2022 走看看