字符串的全排列next_permutaion

来源:互联网 发布:vb 修改批处理 编辑:程序博客网 时间:2024/05/17 01:11

前面写过一篇文章,用的递归的方式做的,这个是按照字典序来写的代码。同时也是c++标准库里面的代码,next_permutaion,非常精炼。

// 字典序的排列,找到下一个字典序的排列#include <iostream>#include <cstdlib>#include <cstring>const int N = 1024;///////////////void swap_value(char &val1, char &val2){    char tmp = val1;    val1 = val2;    val2 = tmp;}void reverse(char *key, int from, int to){    if (to <= from)        return;    int len = to - from + 1;    int index = len / 2;    int i = 0;    int ind1 = 0;    int ind2 = 0;    for (i = 0; i < index; i++)    {        ind1 = from + i;        ind2 = to - i;        swap_value(key[ind1], key[ind2]);    }    return;}bool string_permutation(char *key, int len);void quicksort(char *key, int low, int high){    if (low >= high)        return;    int i = low;    int j = high;    char val = key[j];    while (i < j)    {        while (i < j && key[i] <= val)            i++;        key[j] = key[i];        while (i < j && key[j] > val)            j--;        key[i] = key[j];    }    key[i] = val;    quicksort(key, low, i-1);    quicksort(key, i+1, high);}bool string_permutation(char *key, int len){    int i = 0;    // 找到第一个升序的一个值 val    for (i = len-2; i >= 0; i--)    {        if (key[i] >= key[i+1])            continue;        break;    }    if (i < 0)     {        return false;    }    int k = 0;    // 在i后面找到第一个比val大的值    for (k = len-1; k>i; k--)    {        if (key[k] <= key[i])            continue;        break;    }    // 交换其值    swap_value(key[i], key[k]);    // 倒序,然后输出    reverse(key, i+1, len-1);    return true;}int main(int argc, char *argv[]){    char line[N] = "cbcd";    std::cout << "key string " << line << std::endl;    int len = strlen(line);    quicksort(line, 0, len-1);    std::cout << line << std::endl;    bool flag;    flag = true;    while (flag)    {        flag = string_permutation(line, len);        if (flag)            std::cout << line << std::endl;    }    return 0;}