题目:
        按照以下规则排序:
            

方法一:
稳定排序

思路:
        将原字符串的所有英文字母按忽略大小写进行稳定排序。
        稳定排序的含义:相同字母按输入顺序排序。

        最后,与原字符串比较,如果是英文字母,则将排过序的字母数组赋值替换。

      

#include <bits/stdc++.h>

using namespace std;

bool cmp(char x,char y) {//忽略大小写的排序
    if(x>='a')
        x-=32;
    if(y>='a')
        y-=32;
    return x<y;
}

int main(){
    
    string s;
    while(getline(cin,s)){//输入整行
        vector<char> v;
        int len=s.size();
        for(int i=0;i<len;i++){//遍历,存储英文字母
            if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')){
                v.push_back(s[i]);
            }
        }
        stable_sort(v.begin(),v.end(),cmp);//稳定排序
        int j=0;
        for(int i=0;i<len;i++){//遍历
            if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')){//如果是英文字母,则将排过序的字母数组赋值替换
                s[i]=v[j++];
            }
        }
        cout << s << endl;
    }
    return 0;
}

时间复杂度:
空间复杂度:

方法二:
map

思路:
        map有排序的功能,用map存储英文字符和字符的位置。
        因为不区分英文字母大小写,所以先统一将小写字母变为大写字母,并将键值对的值置为1,表示修改过的标志。

        最后遍历原字符串,如果是英文字母并且键值对的值为1,说明修改过,那么要将大写字母还原为小写字母。


#include <bits/stdc++.h>

using namespace std;

int main(){
    
    string s;
    map<pair<char,int>,int> m;//map存储英文字符和字符的位置
    while(getline(cin,s)){//输入整行
        m.clear();
        int len=s.size();
        for(int i=0;i<len;i++){
            if(s[i]>='a'&&s[i]<='z'){//统一将小写字母变为大写字母,并将键值对的值置为1,表示修改过的标志
                m[{s[i]-32,i}]=1;
            }else if(s[i]>='A'&&s[i]<='Z'){
                m[{s[i],i}]=0;
            }
        }
        map<pair<char,int>,int>::iterator it=m.begin();
        for(int i=0;i<len;i++){//遍历
            if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')){//如果是英文字母
                if(it->second==1)//键值对的值为1,说明修改过,那么要将大写字母还原为小写字母,因此+32
                    s[i]=it->first.first+32;
                else
                    s[i]=it->first.first;
                it++;
            }
        }
        cout << s << endl;
    }
    return 0;
}


时间复杂度:
空间复杂度: