思路:
这道题目最难的地方在题意的理解,尤其是密匙是如何生成的,将拗口的密匙生成过程说明如下,分为两个步骤:
1.对密匙进行去重;
2.对密匙根据字母表剩余字母进行补齐,保证最后的密匙一定是26个字母。
代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
void encrypt(string key,string data,string result){
int size = key.size();
if(size == 0) cout << data;
vector<bool> flag(26,false);
//计算真正的密匙realKey
string realKey = "";
for(int i = 0; i < size; i++){//标记key中的重复字母,生成前部分的realKey
int index = 0;
if(key[i] >= 'a' && key[i] <= 'z')
index = key[i] - 'a';
else if(key[i] >= 'A' && key[i] <= 'Z')
index = key[i] - 'A';
else
cout << "error input";
if(!flag[index]){
flag[index] = true;
realKey += index + 'a';
}
}
for(int j =0; j < 26; j++){
if(!flag[j])
realKey += j + 'a';
}
//计算结果
int length = data.size();
if(length == 0) cout << "";
for(int i = 0; i < length; i++){
int index = 0;
if(data[i] >= 'a' && data[i] <= 'z'){
index = data[i] - 'a';
result += realKey[index];
}
else if(data[i] >= 'A' && data[i] <= 'Z'){
index = data[i] - 'A';
result += realKey[index] - 'a' + 'A';
}
else if(data[i] == ' '){
result += " ";
continue;
}
else
cout << "error input";
}
cout << result;
}
void main(){
string key,data;
string result = "";
cin >> key;
cin >> data;
encrypt(key,data,result);
}