C++ 字符串编码解密:判断加密字符串是否可还原
C++ 字符串编码解密:判断加密字符串是否可还原
小码哥是一名黑客,他最近刚彩票中奖,由于还没兑换,小码哥十分担心彩票被盗(小码哥过分谨慎了),他想为自己的保险箱设新的密码,顺便他想让你测试编码。
现有两种编码方式:
- 对于已知字符串中的任意字符,用其他字符交换,如用'A'和'B'交换,原先用'A'的地方换成'B',用'B'的地方换成'A'。
- 对于当前字符串,打乱字符顺序。
先给你一个加密后的字符串和加密前的字符串,判断加密前的字符串是否能得到加密后的字符串。字符串中字符均为大写字母。
格式
输入格式: 第一行加密后的字符串 第二行加密前的字符串 有多组数据输入 输出格式: 输出'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;
}
原文地址: https://www.cveoy.top/t/topic/nJwO 著作权归作者所有。请勿转载和采集!