题目描述

编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
注意有多组测试数据,即输入有多行,每一行单独处理(换行符隔开的表示不同行)

输入描述:

输入字符串

输出描述:

输出字符串
示例1
输入

A Famous Saying: Much Ado About Nothing (2012/8).

输出

A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).

可以发现,字符串的范围只有区分大小写的26个字母(非字母可以忽略),数据范围很小,所以可以利用桶排序的思想,把字母按顺序一个一个的插入到“捅例如一个字符串"",插入之后如下所示:

然后按顺序取出就可以了
aAagGhhiiSsUu

#include<iostream>
#include<vector>

using namespace std;

int main()
{
    string s;
    while(getline(cin,s))
    {
        string ans = s;
        vector<vector<char>> V(30);
        for(int i = 0 ; i < s.length() ; i++)
        {
            if(s[i]>='A'&&s[i]<='Z')
            {
                ans[i]='a';//只是用来标记一下,用什么字母无所谓
                V[s[i]-'A'].push_back(s[i]);
            }
            else if(s[i]>='a'&&s[i]<='z')
            {
                ans[i]='a';
                V[s[i]-'a'].push_back(s[i]);
            }
        }
        int i = 0,j = 0;
        for(int k = 0 ; k < s.length() ; k++)
        {
            if(ans[k]=='a')
            {
                while(j==V[i].size())
                {
                    i++;
                    j=0;
                }
                ans[k] = V[i][j];
                j++;
            }
        }
        cout<<ans<<endl;;
    }
    return 0;
}