`
dengminghua1016
  • 浏览: 125247 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

针对如"123456"之类的任意字符序列,输出它们所有的排列组合 .

    博客分类:
  • java
阅读更多
思想:针对排列问题,应该将每个位置上可能出现的情况列出来,如有四个不同字符(暂时不考虑有相同情况),那么第一个位置就有四种可能的情况,当第一个位置确定后,第二个位置就只有三种情况,依次类推,最后一个位置只有一种情况,这个对于学过排列组合的人来说,很好理解,关键在于怎样用程序实现呢?

根据上面的分析我们只要挨个把每个位置上出现的字符确定下来,那么这个序列就确定下来了,现在关键是我们针对某个位置出现的情况应该怎样确定呢?比如第一个位置有4种情况,而且每个位置上的字符不相同,那么就可以用整体左移或者右移一位,这样该位置就会出现一种不同的情况,为了要出现四种情况,那么可以用一个循环来控制,直至四种情况都出现。这样该置出现的每种情况也就是确定了这个位置出现的字符。

接下来我们就应该确定第二个位置的字符,第二个位置应该出现三种不同的情况了,也就是从这个位置到最后一个位置上的所有字符作为一个整体向左或右移一位,直至三种情况都出现,也就是有三个位置发生变化,这时会发现这种动作与确定第一个位置使用了相同的方法来确定该位置出现的每种情况,只是少了一位,这就是将一个大的问题转换成一个小一点的问题来解决,那么依次类推,第三个位置的解决办法与第二个位置所使用的方法相同,只是又少移一位(确定的位置不用移动),也就是只有两个位置发生变化,到了最后一个位置了,也就是只有一个位置在变化了,不过怎么变,这个位置上也就只剩下一种情况了,换句话说,这个位置不变了,所有位置上的字符都确定了,那么这时就该输出所有位置上的字符了。

上面这段解释主要是为了引出递归这个思想,我对递归的理解是:对于一个大的问题,可以将它转换成一个较小的问题,然后将这个较小的问题再转换成一个更小的问题来处理,直到最后那个最小的问题得到确定的答案为止,然后再根据这个答案依次回推,而对每个问题都采用相同的方法来处理。下面这个程序的思路是反过来的,也就是先确定最后一个位置出现的情况,然后再确定倒数第二个位置的情况,直到第一个位置确定后输出:



import java.util.Scanner;

public class Permute {

    static int count = 0;
    public static void main(String[] args) {
        System.out.println("please input a String:");
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        Permute p = new Permute();
        System.out.println(str+"出现的所有排列如下:");
        p.permute(str);
        System.out.println();
        System.out.println("总共有"+count+"种排列");
    }

    private void permute(String str) {
        this.permute(str.toCharArray(), 0, str.length() - 1);
    }
//从最后一个位置向前,依次对每个位置上可能出现的字符进行确定(如字符数组是{a,b,c,d},那么最后一个位置可能出现4种情况,确定好第四位置上的字符后,第三个位置可能出现三种情况依次类推)
    private void permute(char[] charArray, int low, int high) {
        int i;
        if (high == low) {//如果是到了第一个位置(low是第一个位置的索引),或者只有一个字符,那么应该输出此字符串
            String str = "";
            for (i = 0; i < charArray.length; i++) {
                str += charArray[i];
            }
            System.out.print(str+"  ");
            count++;
        } else {
            for (int j = low; j <= high; j++) {//将某个位置上可能出现的字符进行遍历(如最后一个位置可能出现high+1种情况)
                for (i = low; i < high; i++) {//将第low位置上的字符移到第high位置上
                    char temp = charArray[i];
                    charArray[i] = charArray[i + 1];
                    charArray[i + 1] = temp;
                }
                permute(charArray, low, high - 1);//当第high位置上的字符确定后,就应该确定第high-1位置上的字符。
            }
        }
    }
}

分享到:
评论
2 楼 FLFLFLFLFLS 2012-03-16  
很实用的,
java代码下载了,在eclipse中运行了一下,
很有效果的[size=x-large]
[/size]
1 楼 FLFLFLFLFLS 2012-03-16  
很实用的,
java代码下载了,在eclipse中运行了一下,
很有效果的[size=x-large][/size]

相关推荐

    世界500强面试题.pdf

    1.6.2. 输入一个字符串,打印出该字符串中字符的所有排列 ........................128 1.6.3. 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数 位于数组的后半部分 ..............

    入门学习Linux常用必会60个命令实例详解doc/txt

    在第三种格式中,会创建所有指定的目录及它们的主目录。长选项必须用的参数在使用短选项时也是必须的。 3.主要参数 --backup[=CONTROL]:为每个已存在的目的地文件进行备份。 -b:类似 --backup,但不接受...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    * Predefined character classes 预定义字符序列 * . Any character (may or may not match line terminators) . 任意字符 (也可能不包括行结束符) * \d A digit: [0-9] \d...

    数据结构(C++)有关练习题

    2、实现1所要求的代码后,运行设计好的代码,将以下的几组整数序列建成搜索二叉树,并记录下它们的前序遍历序列和后序遍历序列: a. 1、3、5、7、9; b. 1、13、35、13、27; c. 50、25、78、13、44、...

    C# for CSDN 乱七八糟的看不懂

    字符串是 Unicode 字符序列 8 位有符号整型 16 位有符号整型 32 位有符号整型 64 位有符号整型 示例 object o = null; 范围 string sbyte short int long string s = "hello"; sbyte val = 12; short val = 12; int...

    PaperTest Q&amp;A笔试综述

    6)已知字符串里的字符是互不相同的,现在任意组合,比如ab,则输出a, ab,ba,bb,编程接照字典序输出所有的组合 .136 八.手写代码. 138 1. strcpy函数…,,,,, 面面1a面 …138 2.atoi.…, 自1面 主主道 138 3....

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。  拉里•埃里森  就业前景 从就业与择业的...

    如何编写批处理文件批处理文件批处理文件

    在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。当然我们...

    LINGO软件的学习

    如果限制派生集的成员,使它成为父集成员所有组合构成的集合的一个子集,这样的派生集成为稀疏集。同原始集一样,派生集成员的声明也可以放在数据部分。一个派生集的成员列表有两种方式生成:①显式罗列;②设置成员...

    Python Cookbook

    1.3 测试一个对象是否是类字符串 8 1.4 字符串对齐 10 1.5 去除字符串两端的空格 11 1.6 合并字符串 11 1.7 将字符串逐字符或逐词反转 14 1.8 检查字符串中是否包含某字符集合中的字符 15 1.9 简化字符串的...

    Excel百宝箱9.0无限制破解版.rar

    【公农双历查询】:生成多功能日历,可以查询所有节、假日和农历 【高级定位】:多功能选择(查找)工具。可以选择大于某值或者小于某值或者在某范围之间的值,文本定位时支持通配符。还可以按格式查找/定位 ...

    C程序范例宝典(基础代码详解)

    实例040 字符升序排列 49 实例041 在指定的位置后插入字符串 50 1.7 函数 51 实例042 求字符串中字符的个数 51 实例043 递归解决年龄问题 53 实例044 求学生的平均身高 54 实例045 分数计算器程序 55 ...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    Exce百宝箱——2012版本.rar

    【批量导入图片(精确匹配)】:瞬间导入所有与选区字符同名的图片到单元格,可以自由设定图片的大小及格式,且全部统一对齐 【批量导入图片(模糊匹配)】:与上一工具基本一致,只是在确定图片名称时可以糊模匹配...

    EXCEL百宝箱8.0终极版

    对引用数据将出现次数多的字符串排列在第一位,然后依次降序排列所有数据。有两个参数,第一参数为数据区域引用,第二参数为名次,可使用ROW(a1)。 函数名称:替换 函数功能与参数:替换第N次出现的字符串的函数。...

    Excel VBA实用技巧大全 附书源码

    04029引用任意单元格区域的右下角单元格(之一) 04030引用任意单元格区域的右下角单元格(之二) 04031引用输入了计算公式的所有单元格 04032引用输入了常量的全部单元格 04033引用输入了数字的全部单元格 04034...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    Dos命令大全

    显示的注释提示您将另一张磁盘放入驱动器 A 时,pause 命令会使程序挂起,以便您更换磁盘,然后按任意键继续处理。 6.Call 命令 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作...

Global site tag (gtag.js) - Google Analytics