Algorithm 版 (精华区)

发信人: sino (茶水︿△︿万艳同杯), 信区: Algorithm
标  题: ACM竞赛辅导--2.1.0
发信站: 哈工大紫丁香 (2000年11月08日20:28:25 星期三), 站内信件

题目:
        键盘输入一个仅由小写字母组成的字符串,输出该串中任取M个字母的所有排列
        及排列总数。
思路:
        观察对于输入caabab的输出结果:
        aaa aab aac aba abb abc aca acb baa bab
        bac bba bbc bca bcb bcc caa cab cbb
        按字母顺序,此序列为递增序列。
        也就是说,我们可用像排字然数类似的方法来排列这些字母。
        首先,将原字符串排序。排序对此题要求的结果没有影响,却可方便我们编程。
        再初始化输出排列,使其为排列中的最小值,在上例中为aaa。
        然后就像自然数加一的操作,每次取下一个与上次不同的排列。
要点:
        使用布尔型数组used记录字母使用的状态(称作标志数组)。
        “每次取下一个与上次不同的排列”时如何找下一个不同的字母呢?
        用比较死板的方法,顺着排序过的字符串前进,总可以找到下一个不同的字母。
        (排序工作没有白费)
        如果基于效率考虑,可以将字符串中出现新字母的位置都记录下来。
测试数据:(只给出总数)
        输入字符串      M       输出结果
        abcdef          6         720
        abcdefghijk     4         7920
        adaade          3         19
        ashjysssjjy     4         387
        adadadererer    5         960
总结: 这是一道基本题。题目不难,但可钻的地方很多。

--
撷取生活中每一朵清新的浪花,智慧的浪花..汇成音乐的海洋.

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.226.245]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.973毫秒