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
  • 相关阅读:
    shell 操作钉钉机器人实现告警提醒
    谨慎 mongodb 关于数字操作可能导致类型及精度变化
    数据库如何应对保障大促活动
    SQL Server Alwayson架构下 服务器 各虚拟IP漂移监控告警的功能实现 -1(服务器视角)
    通过 Telegraf + InfluxDB + Grafana 快速搭建监控体系的详细步骤
    MySQL数据库Inception工具学习与测试 笔记
    MongoDB 中数据的替换方法实现 --类Replace()函数功能
    MongoDB 中的【加减乘除】运算
    MySQL索引设计需要考虑哪些因素?
    关于SQL Server 数据库归档的一些思考和改进
  • 原文地址:https://www.cnblogs.com/liyafei/p/9460766.html
Copyright © 2011-2022 走看看