java字典序全排列

import java.util.Arrays;
/**
*字典序全排列
*字符串的全排列
*比如单词"too" 它的全排列是"oot","oto","too"
*1,从右端开始扫描,若出现前一个比后一个小,记录前一个的元素下表index
*2,再找出index以后比该元素大的中的最小值的下标,(实现见 下面的getMin方法)
*3,index以后的元素实现反转(实现 见下面的reverse方法)
*结束条件:前一个都比后一个大的情况
*/
public class StringExpress{
   int getMin(char[]input,int index){
        char min=input[index];
        int minIndex=index+1;
        char result=‘z‘;
        for(int i=index+1;i<input.length;i++){
              if(input[i]>min&&input[i]<result){
                  result=input[i];
                  minIndex=i;
              }
        }
        return minIndex;
   }
   void exchange(char []input,int index,int minIndex){
           char temp=input[index];
           input[index]=input[minIndex];
           input[minIndex]=temp;
   }
   void reverse(char input[],int first,int end) {
      while(first<end){
           exchange(input,first,end);
           first++;
           end--;
      }
   }
   void getDictionary(char c[]){
       System.out.println(new String(c));
       //boolean flag=true;
       int i=0;
       while(true){
         i=c.length-1;
          for(;i>0;i--){
               if(c[i-1]<c[i])break;
          }
          if(i==0)break;
          int minIndex=getMin(c,i-1);
          exchange(c,i-1,minIndex);
          reverse(c,i,c.length-1);
          System.out.println(new String(c));
       }

   }
   public static void main(String []args){
    String input="aat";
    char [] c=input.toCharArray();
    Arrays.sort(c);
    new StringExpress().getDictionary(c);
   }
}
时间: 2024-08-21 15:08:25

java字典序全排列的相关文章

HDOJ-ACM1016(JAVA) 字典序全排列,并剪枝

转载声明:原文转自http://www.cnblogs.com/xiezie/p/5576273.html 题意: 一个环是用图中所示的n个圆组成的.把自然数1.2.…….n分别放入每个圆中,并在相邻的圆中的数值总和为一个质数. 注:第一圈数应该是1. 输出: 输出格式显示为下面的示例.每一行代表在环里圆中的数从1开始顺时针和逆时针.数字的数量必须满足上述要求.按字典顺序打印解决方案. 你是写一个程序,完成上述过程. 每一种情况下打印一条空白线. 题目分析: 首先,因为需要遍历多次,质数不可能每

字典序全排列(java实现)

import java.util.Arrays; /** *字典序全排列 *字符串的全排列 *比如单词"too" 它的全排列是"oot","oto","too" *1,从右端开始扫描,若出现前一个比好一个小,记录前一个的元素下表index *2,再找出index以后比该元素大的中的最小值的下标,(实现见 下面的getMin方法) *3,index以后的元素实现反转(实现 见下面的reverse方法) *结束条件:前一个都比后一

分治法实现1-N的数字按字典序全排列组合 Java语言

package 分治法; import java.util.Arrays; /* * 将数字 1 - n进行全排列 按字典序从小到大输出 * 如 1 - 3 * 123 132 213 231 312 321 */ class GenerateP{ private int n; // 求 1-n所有数字的全排列 private final int maxn = 110;//最多可排列组合的长度 1-100 private boolean [] hashTable; private int []

JAVA求解全排列

一,问题描述 给定一个字符串,求出该字符串的全排列. 比如:"abc"的全排列是:abc.acb.bac.bca.cab.cba 二,实现思路 采用递归的方式求解.每次先选定一个字符,然后进行“若干次”交换,求出在选定这个字符的条件下,所有的全排列,并把字符“复位”再交换回来.至此,一趟全排列完成.第二趟,选定下一个字符,然后进行“若干次”交换,求出在选定这个字符的条件下,所有的全排列,并把字符“复位”再交换回来...... 就类似于:(参考网上的解释如下:) 设R={r1,r2,..

字典序全排列

给出正整数n,则1~n这n个数可以构成n!种排列,把这些排列按照从小到大的顺序(字典顺序)列出,如n=3时,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1 这6个排列. 字典序算法如下: 假设这n个数的某一个排列为 P: P1 P2 P3...Pj-1 Pj Pj+1...Pk-1 Pk Pk+1...Pn 1.从该序列的最右端开始向左找出第一个比与自己相邻的右边数小的数,记其下标为j,即j = max{i|Pi<pi+1}. 2.找出Pj右边比Pj大的最小数Pk.

全排列 字典序全排列

全排列递归的方法参考 leetcode 47 字典序算法:升序 参考https://www.jianshu.com/p/58ae30cf6bca 实现: 判断了是否相等 计算全排列的数量方法为 n!/ (m!*p!*...)   m,p为重复的数字的重复量 参考 https://blog.csdn.net/sinat_36215255/article/details/78197129 #include<iostream> #include<algorithm> #include&l

java字典序排序

import java.util.Comparator; import java.util.ArrayList; import java.util.Collections; public class Tester { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add("东海湾"); list.add("傲来"); list.add("东海湾

Java实现全排列

鉴于最近在面试,需要复习一下算法什么的,就把之前写的一些算法程序发出来. public class Test { public static char[] text = { 'a', 'c', 'c', 'd' }; public static void main(String[] args) { permutation(text, 0, text.length); System.exit(0); } /** * 全排列输出 * * @param a * [] 要输出的字符数组 * @param

java 实现全排列

听到同学的说的一个面试题-实现12345的全排列,这道题目的解法和迷宫类似,通过递归回溯实现,下面是小弟的实现方法. public static void main(String[] args){ int [] data={1,2,3,4,5}; boolean[] b=new boolean[data.length]; quanpailie(data, b, 0,""); } //递归实现 public static void quanpailie(int [] data,boole