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