Back to all solutions
#2227 - Encrypt and Decrypt Strings
Problem Description
You are given a character array keys containing unique characters and a string array values containing strings of length 2. You are also given another string array dictionary that contains all permitted original strings after decryption. You should implement a data structure that can encrypt or decrypt a 0-indexed string.
A string is encrypted with the following process:
- For each character c in the string, we find the index i satisfying keys[i] == c in keys.
- Replace c with values[i] in the string.
Note that in case a character of the string is not present in keys, the encryption process cannot be carried out, and an empty string "" is returned.
A string is decrypted with the following process:
- For each substring s of length 2 occurring at an even index in the string, we find an i such that values[i] == s. If there are multiple valid i, we choose any one of them. This means a string could have multiple possible strings it can decrypt to.
- Replace s with keys[i] in the string.
Implement the Encrypter class:
- Encrypter(char[] keys, String[] values, String[] dictionary) Initializes the Encrypter class with keys, values, and dictionary.
- String encrypt(String word1) Encrypts word1 with the encryption process described above and returns the encrypted string.
- int decrypt(String word2) Returns the number of possible strings word2 could decrypt to that also appear in dictionary.
Solution
/**
* @param {character[]} keys
* @param {string[]} values
* @param {string[]} dictionary
*/
var Encrypter = function(keys, values, dictionary) {
this.encryptMap = new Map();
this.validEncryptions = new Map();
for (let i = 0; i < keys.length; i++) {
this.encryptMap.set(keys[i], values[i]);
}
for (const word of dictionary) {
const encrypted = this.encrypt(word);
if (encrypted !== '') {
this.validEncryptions.set(encrypted, (this.validEncryptions.get(encrypted) || 0) + 1);
}
}
};
/**
* @param {string} word1
* @return {string}
*/
Encrypter.prototype.encrypt = function(word1) {
let result = '';
for (const char of word1) {
if (!this.encryptMap.has(char)) {
return '';
}
result += this.encryptMap.get(char);
}
return result;
};
/**
* @param {string} word2
* @return {number}
*/
Encrypter.prototype.decrypt = function(word2) {
return this.validEncryptions.get(word2) || 0;
};