Problem
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 indexi
satisfyingkeys[i] == c
inkeys
. - Replace
c
withvalues[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 ani
such thatvalues[i] == s
. If there are multiple validi
, we choose any one of them. This means a string could have multiple possible strings it can decrypt to. - Replace
s
withkeys[i]
in the string.
Implement the Encrypter
class:
Encrypter(char[] keys, String[] values, String[] dictionary)
Initializes theEncrypter
class withkeys, values
, anddictionary
.String encrypt(String word1)
Encryptsword1
with the encryption process described above and returns the encrypted string.int decrypt(String word2)
Returns the number of possible stringsword2
could decrypt to that also appear indictionary
.
Examples
Example 1
|
|
Constraints
1 <= keys.length == values.length <= 26
values[i].length == 2
1 <= dictionary.length <= 100
1 <= dictionary[i].length <= 100
- All
keys[i]
anddictionary[i]
are unique. 1 <= word1.length <= 2000
1 <= word2.length <= 200
- All
word1[i]
appear inkeys
. word2.length
is even.keys
,values[i]
,dictionary[i]
,word1
, andword2
only contain lowercase English letters.- At most
200
calls will be made toencrypt
anddecrypt
in total.
Solution
Method 1 – Trie and Backtracking for Decryption
Intuition
Encryption is a direct mapping from characters to values. Decryption is more complex: since multiple keys can map to the same value, we need to try all possible combinations. Using a trie for the dictionary allows efficient lookup and pruning during backtracking.
Approach
- Build two maps:
enc_map
: char → value (for encryption)dec_map
: value → list of chars (for decryption)
- Build a trie from the dictionary for fast prefix search.
- For
encrypt(word1)
, for each char, append its value fromenc_map
. If any char is missing, return “”. - For
decrypt(word2)
, use backtracking:- At each position, try all possible chars for the current 2-letter substring using
dec_map
. - Traverse the trie as you build the string. If you reach the end and the trie node is a word, count it.
- Return the total count.
- At each position, try all possible chars for the current 2-letter substring using
Code
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Complexity
- ⏰ Time complexity:
O(L * 2^{L/2})
for decryption, whereL
is the length of the encrypted string. Encryption isO(M)
for word lengthM
. - 🧺 Space complexity:
O(N * K)
for the trie, whereN
is the number of words in the dictionary andK
is the average word length`.