mirror of
https://gitee.com/coder-xiaomo/leetcode-problemset
synced 2025-01-11 02:58:13 +08:00
63 lines
3.7 KiB
HTML
63 lines
3.7 KiB
HTML
<p>给你一个字符数组 <code>keys</code> ,由若干 <strong>互不相同</strong> 的字符组成。还有一个字符串数组 <code>values</code> ,内含若干长度为 2 的字符串。另给你一个字符串数组 <code>dictionary</code> ,包含解密后所有允许的原字符串。请你设计并实现一个支持加密及解密下标从 <strong>0</strong> 开始字符串的数据结构。</p>
|
||
|
||
<p>字符串 <strong>加密</strong> 按下述步骤进行:</p>
|
||
|
||
<ol>
|
||
<li>对字符串中的每个字符 <code>c</code> ,先从 <code>keys</code> 中找出满足 <code>keys[i] == c</code> 的下标 <code>i</code> 。</li>
|
||
<li>在字符串中,用 <code>values[i]</code> 替换字符 <code>c</code> 。</li>
|
||
</ol>
|
||
|
||
<p>字符串 <strong>解密</strong> 按下述步骤进行:</p>
|
||
|
||
<ol>
|
||
<li>将字符串每相邻 2 个字符划分为一个子字符串,对于每个子字符串 <code>s</code> ,找出满足 <code>values[i] == s</code> 的一个下标 <code>i</code> 。如果存在多个有效的 <code>i</code> ,从中选择 <strong>任意</strong> 一个。这意味着一个字符串解密可能得到多个解密字符串。</li>
|
||
<li>在字符串中,用 <code>keys[i]</code> 替换 <code>s</code> 。</li>
|
||
</ol>
|
||
|
||
<p>实现 <code>Encrypter</code> 类:</p>
|
||
|
||
<ul>
|
||
<li><code>Encrypter(char[] keys, String[] values, String[] dictionary)</code> 用 <code>keys</code>、<code>values</code> 和 <code>dictionary</code> 初始化 <code>Encrypter</code> 类。</li>
|
||
<li><code>String encrypt(String word1)</code> 按上述加密过程完成对 <code>word1</code> 的加密,并返回加密后的字符串。</li>
|
||
<li><code>int decrypt(String word2)</code> 统计并返回可以由 <code>word2</code> 解密得到且出现在 <code>dictionary</code> 中的字符串数目。</li>
|
||
</ul>
|
||
|
||
<p> </p>
|
||
|
||
<p><strong>示例:</strong></p>
|
||
|
||
<pre>
|
||
<strong>输入:</strong>
|
||
["Encrypter", "encrypt", "decrypt"]
|
||
[[['a', 'b', 'c', 'd'], ["ei", "zf", "ei", "am"], ["abcd", "acbd", "adbc", "badc", "dacb", "cadb", "cbda", "abad"]], ["abcd"], ["eizfeiam"]]
|
||
<strong>输出:</strong>
|
||
[null, "eizfeiam", 2]
|
||
|
||
<strong>解释:</strong>
|
||
Encrypter encrypter = new Encrypter([['a', 'b', 'c', 'd'], ["ei", "zf", "ei", "am"], ["abcd", "acbd", "adbc", "badc", "dacb", "cadb", "cbda", "abad"]);
|
||
encrypter.encrypt("abcd"); // 返回 "eizfeiam"。
|
||
// 'a' 映射为 "ei",'b' 映射为 "zf",'c' 映射为 "ei",'d' 映射为 "am"。
|
||
encrypter.decrypt("eizfeiam"); // return 2.
|
||
// "ei" 可以映射为 'a' 或 'c',"zf" 映射为 'b',"am" 映射为 'd'。
|
||
// 因此,解密后可以得到的字符串是 "abad","cbad","abcd" 和 "cbcd"。
|
||
// 其中 2 个字符串,"abad" 和 "abcd",在 dictionary 中出现,所以答案是 2 。
|
||
</pre>
|
||
|
||
<p> </p>
|
||
|
||
<p><strong>提示:</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>所有 <code>keys[i]</code> 和 <code>dictionary[i]</code> <strong>互不相同</strong></li>
|
||
<li><code>1 <= word1.length <= 2000</code></li>
|
||
<li><code>1 <= word2.length <= 200</code></li>
|
||
<li>所有 <code>word1[i]</code> 都出现在 <code>keys</code> 中</li>
|
||
<li><code>word2.length</code> 是偶数</li>
|
||
<li><code>keys</code>、<code>values[i]</code>、<code>dictionary[i]</code>、<code>word1</code> 和 <code>word2</code> 只含小写英文字母</li>
|
||
<li>至多调用 <code>encrypt</code> 和 <code>decrypt</code> <strong>总计</strong> <code>200</code> 次</li>
|
||
</ul>
|