zoukankan      html  css  js  c++  java
  • 简单的字母全排列问题—递归法和STL法

    问题描述:求全由小写字母组成的不超过200个字符序列的全排列
    如输入序列bbjd,排列结果为:
    bbdj
    bbjd
    bdbj
    bdjb
    bjbd
    bjdb
    dbbj
    dbjb
    djbb
    jbbd
    jbdb
    jdbb
     
    方法一:递归法
     
    代码如下:
     
    #include <stdio.h>
    
    int t[200];
    char s[200];
    int n = 0;
    
    void permutation(int i)
    {
        int k;
    
        // a~z的ASCII码在97到122之间
        for(k = 97; k < 123; k++)
        {
            if(t[k])
            {
                t[s[i] = k]--;
                permutation(i + 1);
                t[k]++;
            }
        }
    
        // 只有n个字母全部排好了才输出
        n - i || puts(s);
    }
    
    int main()
    {    
        int i;
    
        puts("Please Input letter sequence: ");
        gets(s);
    
        // t[]记录每个字母的出现频率
        // n为待排序列的长度
        for(i = 0; s[i] != ''; i++)
        {
            t[s[i]]++;
            n++;
        }
    
        puts("Permutation result: ");
        permutation(0);
    
        return 0;
    }

    运行结果如下:

    方法二:STL法

    C++的STL有一个函数可以方便地生成全排列,这就是next_permutation

    在C++ Reference中查看了一下next_permutation的函数声明:

    #include <algorithm>
    bool next_permutation( iterator start, iterator end );

    The next_permutation() function attempts to transform the given range of elements [start,end) into the next lexicographically greater permutation of elements. If it succeeds, it returns true, otherwise, it returns false.

    从说明中可以看到 next_permutation 的返回值是布尔类型。按照提示写了一个标准C++程序:

    其中用到了 sort 函数,如果不先排序,则完成不了全排列。

    #include <iostream>
    #include <string>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
        string str;
    
        cout << "Please Input letter sequence: 
    ";
        cin >> str;
        
        // 必须先排序
        sort(str.begin(), str.end());
        cout << str << endl;
    
        cout << "Permutation result: 
    ";
    
        while(next_permutation(str.begin(), str.end()))
        {
            cout << str << endl;
        }
    
        return 0;
    }

    运行结果如下:

    在使用稍大数据测试的时候,发现标准C++的效率很差,换成C函数写一下,效率提升了许多倍,比如我用字符序列“aabbddef”作为测试,上面C++代码用了6s,而下面的C代码只用了0.918s。所以,平时写代码时能用C就用C。

    #include <stdio.h>
    #include <algorithm>
    
    using namespace std;
    
    int main()
    {
        char str[200];
        int len;
    
        puts("Please Input letter sequence: ");
        gets(str);
    
        len = strlen(str);
        
        // 必须先排序
        sort(str, str + len);
    
        puts("Permutation result: ");
        puts(str);
    
        while(next_permutation(str, str + len))
        {
            puts(str);
        }
    
        return 0;
    }
  • 相关阅读:
    Java for LeetCode 229 Majority Element II
    Java for LeetCode 228 Summary Ranges
    Java for LeetCode 227 Basic Calculator II
    Java for LintCode 颜色分类
    Java for LintCode 链表插入排序
    Java for LintCode 颠倒整数
    Java for LintCode 验证二叉查找树
    Java for LeetCode 226 Invert Binary Tree
    Java for LeetCode 225 Implement Stack using Queues
    Java for LeetCode 224 Basic Calculator
  • 原文地址:https://www.cnblogs.com/lanxuezaipiao/p/3299601.html
Copyright © 2011-2022 走看看