通过将辅音替换为最接近的元音或将辅音替换为最接近的元音来计算唯一字符串的数量
在这个问题中,我们将计算通过将每个元音替换为最接近的辅音并将每个辅音替换为最接近的元音可以生成的唯一字符串的数量。
我们可以找到字符串中每个字符的选择数量,以将当前字符替换为其他字符。之后,我们可以将每个字符的选择数量相乘以获得答案。
问题陈述
我们给出了一个字母字符串。我们需要通过对字符串的每个字符执行以下操作来计算我们可以从给定字符串生成的不同字符串的总数
将元音更改为任何最接近的辅音。
将辅音更改为任何最接近的元音。
不要考虑圆周距离。
示例
输入 – alpha = "abcd" 输出 – 2
解释
我们只能用"b"替换"a"。
我们只能用"a"替换"b"。
我们可以替换'c' 替换为 'a' 或 'e'。
我们可以用 'e' 替换 'd'。
因此,替换字符串中每个字符的选择是 1、1、2、1。当我们将所有选择相乘时,我们得到的答案是 2。
输入 – alpha = "cglr" 输出 – 16
解释
我们有两个选择,可以用两个元音替换字符串中的每个字符。
输入 – alpha = "pppppp" 输出 – 1
解释
由于所有字符都是相同,我们可以用"o"代替"p",答案是1。
方法 1
在此方法中,我们将元音的位置存储在映射中以找到最接近的辅音。对于除"a"之外的每个元音,有两种选择可以用辅音替换字符。
此外,"c"、"g"、"l"和"r"辅音有两种选择可以用最接近的元音替换,而其他辅音只有 1 种选择。对于辅音,我们可以找到替换每个字符的选择,并将每个选择相乘以获得答案。基本上,这个问题与根据给定条件找到总排列非常相似。
算法
步骤 1 - 用 1 初始化"cnt"以存储答案。
步骤 2 - 将所有元音及其基于 0 的索引存储在"元音"映射中。
步骤 3 - 开始遍历字符串,并在"元音"映射中找到字符。
步骤 4 - 如果元音映射中不存在该字符,则检查该字符是"c"、"g"、"l"还是"r"。如果是,则将"cnt"值乘以 2。
步骤 5 - 如果该字符存在于元音映射中,并且该字符不是"a",则将"cnt"值乘以 1。
步骤 6 - 返回"cnt"值。
示例
#include <bits/stdc++.h> using namespace std; int calculateUniqueStrings(string alpha) { int len = alpha.size(); int cnt = 1; // 元音映射 map<char, int> vowels; vowels['a'] = 0; vowels['e'] = 4; vowels['i'] = 8; vowels['o'] = 14; vowels['u'] = 20; for (int p = 0; p < len; p++) { // 对于辅音 if (vowels.find(alpha[p]) == vowels.end()) { int ch = alpha[p] - 'a'; // 对于 c、g、l 和 r 辅音 if (ch == 2 || ch == 6 || ch == 11 || ch == 17) cnt *= 2; } // For vowel else { // 除了 'a' 之外,每个元音都有两个选择 if (alpha[p] != 'a') cnt *= 2; } } return cnt; } int main() { string alpha = "abgd"; cout << "通过替换字符,我们可以得到的唯一字符串总数是" << calculateUniqueStrings(alpha) << endl; return 0; }
输出
通过替换字符,我们可以得到的唯一字符串总数是 2
时间复杂度 - O(N) 用于替换字符串的每个字符。
空间复杂度 - O(1),因为我们不使用任何额外空间。
我们学会了通过用最近的元音或辅音替换字符串的每个字符来找到许多不同的字符串。程序员可以通过仅替换一个字符来解决计算我们可以形成的不同字符串数量的问题。