C++ 字符串编码解密:判断加密字符串是否可还原

小码哥是一名黑客,他最近刚彩票中奖,由于还没兑换,小码哥十分担心彩票被盗(小码哥过分谨慎了),他想为自己的保险箱设新的密码,顺便他想让你测试编码。

现有两种编码方式:

  1. 对于已知字符串中的任意字符,用其他字符交换,如用'A'和'B'交换,原先用'A'的地方换成'B',用'B'的地方换成'A'。
  2. 对于当前字符串,打乱字符顺序。

先给你一个加密后的字符串和加密前的字符串,判断加密前的字符串是否能得到加密后的字符串。字符串中字符均为大写字母。

格式

输入格式: 第一行加密后的字符串 第二行加密前的字符串 有多组数据输入 输出格式: 输出'YES'或'NO'

样例1

输入:

JWPUDJSTVP VICTORIOUS
MAMA ROME
HAHA HEHE
AAA AAA
NEERCISTHEBEST SECRETMESSAGES

输出:

YES
NO
YES
YES
NO

备注:

所有字符串长度不超过100

代码内容:

#include <iostream>
#include <cstring>
using namespace std;

string swap(string str, char a, char b) { //交换函数
    for(int i=0; i<str.length(); i++) {
        if(str[i] == a) {
            str[i] = b;
        } else if(str[i] == b) {
            str[i] = a;
        }
    }
    return str;
}

string shuffle(string str) { //打乱函数
    int len = str.length();
    for(int i=len-1; i>=0; i--) {
        int j = rand()%len;
        swap(str[i], str[j]);
    }
    return str;
}

bool check(string str1, string str2) { //判断函数
    if(str1 == str2) {
        return true;
    }
    for(char a='A'; a<='Z'; a++) {
        for(char b=a+1; b<='Z'; b++) {
            string tmp = swap(str2, a, b);
            if(tmp == str1) {
                return true;
            }
        }
    }
    string tmp = shuffle(str2);
    if(tmp == str1) {
        return true;
    }
    return false;
}

int main() {
    string str1, str2;
    while(cin >> str1 >> str2) {
        if(check(str1, str2)) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }
    }
    return 0;
}
C++ 字符串编码解密:判断加密字符串是否可还原

原文地址: https://www.cveoy.top/t/topic/nJwO 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录