串中取3个不重复字母(蓝桥杯)

从标准输入读入一个由字母构成的串(不大于30个字符)。
从该串中取出3个不重复的字符,求所有的取法。
取出的字符,要求按字母升序排列成一个串。

不同的取法输出顺序可以不考虑。

例如:
输入:
abc
则输出:

abc


输入:
abcd
则输出:
abc
abd
acd
bcd

输入:
abcaa
则输出:

abc

分析:总体分为三个部分:
1,排序;2,去重;3,输出结果


1,排序:题目中要求:
     那么将输入的字符串排序后,能方便最后的输出。
2,去重:题目中要求:
     因为输入的字符串可能会有重复,为避免取出的字符串中有重复出现的,所以需进行去重操作。
3,输出结果

具体实现:
1,排序:最多只会有30个字符,所以直接使用冒泡排序即可。
2,去重:建立一个新的字符串,利用循环,遍历原字符串,若当前遍历字符与后一字符不相同,那么就将其放入新的字符串中,这样得到的新字符串就是不重复的了。
3,输出结果:三重循环,穷举出所有答案。

AC代码:

#include 
#include 
#include 

int main()
{
    char str1[31],str2[31],t;
    int len,i,j,k,p=0;
    gets(str1);
    len=strlen(str1);
    /**冒泡排序:**/
    for(i=0; istr1[j+1])
            {
                t=str1[j];
                str1[j]=str1[j+1];
                str1[j+1]=t;
            }
        }

/**将重复的字符去掉,得到新字符串str2:**/
    for(i=0; i

一个问题就是这段代码不分数字还是字母都会执行,而题目明确要求了由字母构成的串,所以进行如下改进。

int judge=0;//使用judge变量判断是否全为字母
    for(i=0; i'z')&&(str1[i]<'A'||str1[i]>'Z'))
        {
            judge=1;
            break;
        }
    if(judge==0)
    {
        /**排序:**/
        for(i=0; i


你可能感兴趣的:(串中取3个不重复字母(蓝桥杯))