题意:
按照以下规则变换字符串:
方法一:
模拟
思路:直接模拟。
先循环遍历密钥字符串,再遍历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;
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号