题意:
           按照以下规则变换字符串:
            

方法一:
模拟

思路:
            直接模拟。
            先循环遍历密钥字符串,再遍历26个小写字母,得到新字母表。
            再循环遍历明文,通过新字母表映射,得到密文。

        

#include <bits/stdc++.h>

using namespace std;
string key,s;
int vis[26];

int main(){
    while(cin >> key >> s){
        memset(vis,0,sizeof(vis));//初始化26个字母都未被访问
        string x="";
        int len=key.size();
        for(int i=0;i<len;i++){
            int j=key[i]-'a';
            if(vis[j]==0){//如果该字母未访问,则vis[]标记为1
                vis[j]=1;
                x+=key[i];
            }
        }
        for(int i=0;i<26;i++){//添加未访问的字母
            if(vis[i]==0)
                x+=i+'a';
        }
        string res="";
        for(int i=0;i<s.size();i++){//遍历判断
            int j=s[i]-'a';
            res+=x[j];
        }
        cout << res << endl;
    }
    return 0;
}

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


方法二:
set去重

思路:
        利用set实现去重效果,来满足单词中包含有重复的字母,只保留第1个的条件。
        set通过count()函数判断集合中是否存在该字符,如果不存在,说明是第一次,则添加;
        否则,跳过该字符。
        

#include <bits/stdc++.h>

using namespace std;
string key,s;
unordered_set<char> st;

int main(){
    while(cin >> key >> s){
        st.clear();
        string x="";
        int len=key.size();
        for(int i=0;i<len;i++){
            if(st.count(key[i]))//如果已经有了该字符,则跳过
                continue;
            st.insert(key[i]);//添加相同字符的第一个
            x+=key[i];
        }
        for(int i=0;i<26;i++){//添加新的字母
            if(st.count(i+'a')==0)
                x+=i+'a';
        }
        string res="";
        for(int i=0;i<s.size();i++){//遍历判断
            int j=s[i]-'a';
            res+=x[j];
        }
        cout << res << endl;
    }
    return 0;
}

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