java.lang.Object
g2201_2300.s2227_encrypt_and_decrypt_strings.Encrypter

public class Encrypter extends Object
2227 - Encrypt and Decrypt Strings.<p>Hard</p> <p>You are given a character array <code>keys</code> containing <strong>unique</strong> characters and a string array <code>values</code> containing strings of length 2. You are also given another string array <code>dictionary</code> that contains all permitted original strings after decryption. You should implement a data structure that can encrypt or decrypt a <strong>0-indexed</strong> string.</p> <p>A string is <strong>encrypted</strong> with the following process:</p> <ol> <li>For each character <code>c</code> in the string, we find the index <code>i</code> satisfying <code>keys[i] == c</code> in <code>keys</code>.</li> <li>Replace <code>c</code> with <code>values[i]</code> in the string.</li> </ol> <p>Note that in case a character of the string is <strong>not present</strong> in <code>keys</code>, the encryption process cannot be carried out, and an empty string <code>&quot;&quot;</code> is returned.</p> <p>A string is <strong>decrypted</strong> with the following process:</p> <ol> <li>For each substring <code>s</code> of length 2 occurring at an even index in the string, we find an <code>i</code> such that <code>values[i] == s</code>. If there are multiple valid <code>i</code>, we choose <strong>any</strong> one of them. This means a string could have multiple possible strings it can decrypt to.</li> <li>Replace <code>s</code> with <code>keys[i]</code> in the string.</li> </ol> <p>Implement the <code>Encrypter</code> class:</p> <ul> <li><code>Encrypter(char[] keys, String[] values, String[] dictionary)</code> Initializes the <code>Encrypter</code> class with <code>keys, values</code>, and <code>dictionary</code>.</li> <li><code>String encrypt(String word1)</code> Encrypts <code>word1</code> with the encryption process described above and returns the encrypted string.</li> <li><code>int decrypt(String word2)</code> Returns the number of possible strings <code>word2</code> could decrypt to that also appear in <code>dictionary</code>.</li> </ul> <p><strong>Example 1:</strong></p> <p><strong>Input</strong> [&ldquo;Encrypter&rdquo;, &ldquo;encrypt&rdquo;, &ldquo;decrypt&rdquo;] [[[&lsquo;a&rsquo;, &lsquo;b&rsquo;, &lsquo;c&rsquo;, &lsquo;d&rsquo;], [&ldquo;ei&rdquo;, &ldquo;zf&rdquo;, &ldquo;ei&rdquo;, &ldquo;am&rdquo;], [&ldquo;abcd&rdquo;, &ldquo;acbd&rdquo;, &ldquo;adbc&rdquo;, &ldquo;badc&rdquo;, &ldquo;dacb&rdquo;, &ldquo;cadb&rdquo;, &ldquo;cbda&rdquo;, &ldquo;abad&rdquo;]], [&ldquo;abcd&rdquo;], [&ldquo;eizfeiam&rdquo;]]</p> <p><strong>Output:</strong> [null, &ldquo;eizfeiam&rdquo;, 2]</p> <p><strong>Explanation:</strong> Encrypter encrypter = new Encrypter([[&lsquo;a&rsquo;, &lsquo;b&rsquo;, &lsquo;c&rsquo;, &lsquo;d&rsquo;], [&ldquo;ei&rdquo;, &ldquo;zf&rdquo;, &ldquo;ei&rdquo;, &ldquo;am&rdquo;], [&ldquo;abcd&rdquo;, &ldquo;acbd&rdquo;, &ldquo;adbc&rdquo;, &ldquo;badc&rdquo;, &ldquo;dacb&rdquo;, &ldquo;cadb&rdquo;, &ldquo;cbda&rdquo;, &ldquo;abad&rdquo;]);</p> <p>encrypter.encrypt(&ldquo;abcd&rdquo;); // return &ldquo;eizfeiam&rdquo;. // &lsquo;a&rsquo; maps to &ldquo;ei&rdquo;, &lsquo;b&rsquo; maps to &ldquo;zf&rdquo;, &lsquo;c&rsquo; maps to &ldquo;ei&rdquo;, and &lsquo;d&rsquo; maps to &ldquo;am&rdquo;.</p> <p>encrypter.decrypt(&ldquo;eizfeiam&rdquo;); // return 2. // &ldquo;ei&rdquo; can map to &lsquo;a&rsquo; or &lsquo;c&rsquo;, &ldquo;zf&rdquo; maps to &lsquo;b&rsquo;, and &ldquo;am&rdquo; maps to &lsquo;d&rsquo;. // Thus, the possible strings after decryption are &ldquo;abad&rdquo;, &ldquo;cbad&rdquo;, &ldquo;abcd&rdquo;, and &ldquo;cbcd&rdquo;. // 2 of those strings, &ldquo;abad&rdquo; and &ldquo;abcd&rdquo;, appear in dictionary, so the answer is 2.</p> <p><strong>Constraints:</strong></p> <ul> <li><code>1 <= keys.length == values.length <= 26</code></li> <li><code>values[i].length == 2</code></li> <li><code>1 <= dictionary.length <= 100</code></li> <li><code>1 <= dictionary[i].length <= 100</code></li> <li>All <code>keys[i]</code> and <code>dictionary[i]</code> are <strong>unique</strong>.</li> <li><code>1 <= word1.length <= 2000</code></li> <li><code>1 <= word2.length <= 200</code></li> <li>All <code>word1[i]</code> appear in <code>keys</code>.</li> <li><code>word2.length</code> is even.</li> <li><code>keys</code>, <code>values[i]</code>, <code>dictionary[i]</code>, <code>word1</code>, and <code>word2</code> only contain lowercase English letters.</li> <li>At most <code>200</code> calls will be made to <code>encrypt</code> and <code>decrypt</code> <strong>in total</strong>.</li> </ul>
  • Constructor Details

    • Encrypter

      public Encrypter(char[] keys, String[] values, String[] dictionary)
  • Method Details

    • encrypt

      public String encrypt(String word1)
    • decrypt

      public int decrypt(String word2)