zoukankan      html  css  js  c++  java
  • 剑指OFFER之字符串的排列(九度OJ1369)

    题目描述:

     

    输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

     

     

    输入:

     

    每个测试案例包括1行。

    输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

     

     

     

    输出:

    对应每组数据,按字典序输出所有排列。

     

     

     

     

    样例输入:
    abc
    BCA
    样例输出:
    abc
    acb
    bac
    bca
    cab
    cba
    ABC
    ACB
    BAC
    BCA
    CAB
    CBA

    解题思路:

      这道题要注意两个问题:

      第一个是重复字母,第二个是按字典顺序

      重复字母我们在进行交换的时候直接跳过就可以了,按字典顺序,这个就需要我们进行排列了。

      排列使用冒泡排序:

    void bubbleSort(char *arr,int begin,int length){
        int i,j;
        for(i=begin;i<length;i++){
            for(j=i+1;j<length;j++){
                if(arr[i]>arr[j]){
                    swap(&arr[i],&arr[j]);
                }
            }
        }
    }

      进行交换时,注意忽略掉重复的字符交换:

    void Permulation(char *arr,int k,int length){
        int i;
        if(k == length){
            for(i=0;i<length;i++)
                printf("%c",arr[i]);
            printf("
    ");
        }else{
            for(i=k;i<length;i++){
                if(k != i && arr[k] == arr[i])
                    continue;
                swap(&arr[k],&arr[i]);
                bubbleSort(arr,k+1,length);
                Permulation(arr,k+1,length);
                bubbleSort(arr,k+1,length);
            }
        }
    }

      每次在进行交换后,都把剩余的元素进行一次排列。比如字符串abc,在进行最后一次外层交换时变成 cba。

      此时要进行一次排序,交换cab后,在进行排列。

    全部代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void bubbleSort(char *arr,int begin,int length);
    void swap(char *a,char *b);
    void Permulation(char *arr,int k,int length);
     
    int main(){
        char arr[10];
        int length;
        int i;
        while(gets(arr)){
            length = strlen(arr);
            bubbleSort(arr,0,length);
            Permulation(arr,0,length);
        }
        return 0;
    }
    void Permulation(char *arr,int k,int length){
        int i;
        if(k == length){
            for(i=0;i<length;i++)
                printf("%c",arr[i]);
            printf("
    ");
        }else{
            for(i=k;i<length;i++){
                if(k != i && arr[k] == arr[i])
                    continue;
                swap(&arr[k],&arr[i]);
                bubbleSort(arr,k+1,length);
                Permulation(arr,k+1,length);
                bubbleSort(arr,k+1,length);
            }
        }
    }
    void swap(char *a,char *b){
        char c;
        c = *b;
        *b = *a;
        *a = c;
    }
    void bubbleSort(char *arr,int begin,int length){
        int i,j;
        for(i=begin;i<length;i++){
            for(j=i+1;j<length;j++){
                if(arr[i]>arr[j]){
                    swap(&arr[i],&arr[j]);
                }
            }
        }
    }
    /**************************************************************
        Problem: 1369
        User: xhalo
        Language: C
        Result: Accepted
        Time:470 ms
        Memory:912 kb
    ****************************************************************/
  • 相关阅读:
    php中的heredoc和nowdoc对比
    PHP官方网站及PHP手册
    php扩展编译方法
    linux下修改时间和时区
    个人觉得非常好用的mysql客户端工具HeidiSQL
    mysql主从复制总结
    mysql优化的21条经验(转)
    mysql存储引擎选择(转)
    show profiles 分析sql耗时瓶颈
    tar命令的使用方法
  • 原文地址:https://www.cnblogs.com/xing901022/p/3783381.html
Copyright © 2011-2022 走看看