列表

详情


MGJ14. 字符串的排列

描述

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

输入描述

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

输出描述

[ac, ca]

示例1

输入:

acc

输出:

[acc, cac, cca]

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 360KB, 提交时间: 2020-05-20

#include<stdio.h>
#include<string.h>
char t[10]={0};
int cnt=0;
void convert(char *strSource, char *strTarget, int nLen)
{
    int i, j;
    char strConvert[10];
    
    if(nLen == 1)
    {
        strTarget[0] = strSource[0];
        if(cnt)
        printf(", %s", t);
        else
        printf("[%s", t);
        return;
    }
    else
    {
        for(i=0; i<nLen; i++)
        {
            for(j=0; j<i && strSource[i] != strSource[j]; j++);
            if(j == i)
            {
                strTarget[0] = strSource[i];
                memcpy(strConvert, strSource, i);
                memcpy(strConvert+i, strSource+i+1, nLen-i-1);
                convert(strConvert, strTarget+1, nLen-1);
                cnt++;
            }
        }
    }
}
int main()
{
    char s[10],temp[52]={0};
    int n,i=0,j=0,k=0;
    scanf("%s",s);
       
    for(j=0;j<26;j++)
    {
        for(i=0;i<strlen(s);i++)
        {
            if((s[i]=='A'+j))
            {
                temp[k++]=s[i];
            }
        }
    }
    for(j=0;j<26;j++)
    {
        for(i=0;i<strlen(s);i++)
        {
            if((s[i]=='a'+j))
            {
                temp[k++]=s[i];
            }
        }
    }
    k=0;
    for(i=0;i<strlen(s);i++)
    {
        s[i]=temp[k++];
    }
    convert(s, t, strlen(s));
    printf("]");
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 364KB, 提交时间: 2020-05-15

#include<stdio.h>
#include<string.h>
char t[10]={0};
int cnt=0;
void convert(char *strSource, char *strTarget, int nLen)
{
    int i, j;
    char strConvert[10];
   
    if(nLen == 1)
    {
        strTarget[0] = strSource[0];
        if(cnt)
        printf(", %s", t);
        else
        printf("[%s", t);
        return;
    }
    else
    {
        for(i=0; i<nLen; i++)
        {
            for(j=0; j<i && strSource[i] != strSource[j]; j++);
            if(j == i)
            {
                strTarget[0] = strSource[i];
                memcpy(strConvert, strSource, i);
                memcpy(strConvert+i, strSource+i+1, nLen-i-1);
                convert(strConvert, strTarget+1, nLen-1);
                cnt++;
            }
        }
    }
}
int main()
{
    char s[10],temp[52]={0};
    int n,i=0,j=0,k=0;
    scanf("%s",s);
      
    for(j=0;j<26;j++)
    {
        for(i=0;i<strlen(s);i++)
        {
            if((s[i]=='A'+j))
            {
                temp[k++]=s[i];
            }
        }
    }
    for(j=0;j<26;j++)
    {
        for(i=0;i<strlen(s);i++)
        {
            if((s[i]=='a'+j))
            {
                temp[k++]=s[i];
            }
        }
    }
    k=0;
    for(i=0;i<strlen(s);i++)
    {
        s[i]=temp[k++];
    }
    convert(s, t, strlen(s));
    printf("]");
    return 0;
}

上一题