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:
c in the string, we find the index i satisfying keys[i] == c in keys.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:
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.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.Example 1:
Input
["Encrypter", "encrypt", "decrypt"]
[[['a', 'b', 'c', 'd'], ["ei", "zf", "ei", "am"], ["abcd", "acbd", "adbc", "badc", "dacb", "cadb", "cbda", "abad"]], ["abcd"], ["eizfeiam"]]
Output
[null, "eizfeiam", 2]
Explanation
Encrypter encrypter = new Encrypter([['a', 'b', 'c', 'd'], ["ei", "zf", "ei", "am"], ["abcd", "acbd", "adbc", "badc", "dacb", "cadb", "cbda", "abad"]);
encrypter.encrypt("abcd"); // return "eizfeiam".
// 'a' maps to "ei", 'b' maps to "zf", 'c' maps to "ei", and 'd' maps to "am".
encrypter.decrypt("eizfeiam"); // return 2.
// "ei" can map to 'a' or 'c', "zf" maps to 'b', and "am" maps to 'd'.
// Thus, the possible strings after decryption are "abad", "cbad", "abcd", and "cbcd".
// 2 of those strings, "abad" and "abcd", appear in dictionary, so the answer is 2.
Constraints:
1 <= keys.length == values.length <= 26values[i].length == 21 <= dictionary.length <= 1001 <= dictionary[i].length <= 100keys[i] and dictionary[i] are unique.1 <= word1.length <= 20002 <= word2.length <= 200word1[i] appear in keys.word2.length is even.keys, values[i], dictionary[i], word1, and word2 only contain lowercase English letters.200 calls will be made to encrypt and decrypt in total.When you get asked this question in a real-life environment, it will often be ambiguous (especially at FAANG). Make sure to ask these questions in that case:
The brute force approach to encrypting and decrypting strings involves trying every possible key until the correct one is found. It's like trying every combination on a lock until it opens. This is generally not a good idea because it takes a very long time.
Here's how the algorithm would work step-by-step:
def brute_force_decrypt(encrypted_text, original_text):
for possible_key in range(256):
decrypted_text = ""
for character in encrypted_text:
decrypted_character = chr(ord(character) ^ possible_key)
decrypted_text += decrypted_character
# Check if decrypted text matches the original text
if decrypted_text == original_text:
return possible_key
return None
def brute_force_encrypt(original_text, encryption_key):
encrypted_text = ""
for character in original_text:
encrypted_character = chr(ord(character) ^ encryption_key)
encrypted_text += encrypted_character
return encrypted_text
def encrypt_and_decrypt(original_text):
encryption_key = 42
encrypted_text = brute_force_encrypt(original_text, encryption_key)
# Attempt to find the original key via decryption
found_key = brute_force_decrypt(encrypted_text, original_text)
# If the key is found, return
if found_key is not None:
return encrypted_text, found_key
else:
return None, NoneTo encrypt and decrypt strings efficiently, we'll use a simple substitution method based on a key. Encryption transforms the original message, while decryption reverses it using the same key.
Here's how the algorithm would work step-by-step:
def encrypt_string(plain_text, encryption_key):
encrypted_text = ''
for character in plain_text:
if character in encryption_key:
encrypted_text += encryption_key[character]
else:
encrypted_text += character
return encrypted_text
def decrypt_string(encrypted_text, encryption_key):
# Need to reverse the key for decryption
decryption_key = {value: key for key, value in encryption_key.items()}
decrypted_text = ''
for character in encrypted_text:
# Attempt decryption, leave character untouched if not in key.
if character in decryption_key:
decrypted_text += decryption_key[character]
else:
decrypted_text += character
return decrypted_text| Case | How to Handle |
|---|---|
| Null or empty input string for encryption | Return an empty string or throw an IllegalArgumentException, depending on requirements. |
| Null or empty key for encryption/decryption | Throw an IllegalArgumentException to indicate an invalid state. |
| Key length is zero | Treat this as no encryption, return the original string or throw an exception. |
| Very long input string (performance implications) | Ensure that the algorithm scales linearly or better with string length to avoid timeouts. |
| Key contains special characters or non-ASCII characters | Define and document the supported character set for the key and input, handling unsupported characters appropriately (e.g., by excluding them or throwing an exception). |
| Input string contains non-alphanumeric characters when the algorithm is expecting only alphanumeric input. | Handle non-alphanumeric characters either by removing them, encoding them differently, or throwing an error. |
| Encryption results in non-printable characters | Use Base64 encoding or another suitable encoding scheme to represent the encrypted string as printable characters. |
| Decryption key is incorrect/corrupted | Return an error indicating an invalid key or potentially return a garbled/incorrectly decrypted string (depending on requirements). |