[华为OJ] 字符串加密

来源:互联网 发布:广东麻将app源码 编辑:程序博客网 时间:2024/05/18 09:12

思路:

这道题目最难的地方在题意的理解,尤其是密匙是如何生成的,将拗口的密匙生成过程说明如下,分为两个步骤:

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);        }



0 0