通过将辅音替换为最接近的元音,反之亦然,来计算唯一字符串的数量
在这个问题中,我们将计算通过替换每个元音为最接近的辅音,每个辅音为最接近的元音,可以生成的唯一字符串的数量。
我们可以找到每个字符替换当前字符为其他字符的选择数量。之后,我们可以将每个字符的选择数量相乘得到答案。
问题陈述
我们给定了一个字母字符串。我们需要计算通过对字符串的每个字符执行以下操作,可以从给定字符串生成的不同字符串的总数
将元音更改为任何最接近的辅音。
将辅音更改为任何最接近的元音。
不考虑循环距离。
示例
Input – alpha = "abcd" Output – 2
解释
我们可以用“b”替换“a”。
我们可以用“a”替换“b”。
我们可以用“a”或“e”替换“c”。
我们可以用“e”替换“d”。
因此,替换字符串每个字符的选择是 1、1、2、1。当我们将所有选择相乘时,我们得到 2 作为答案。
Input – alpha = "cglr" Output – 16
解释
我们有两个选择来用两个元音替换字符串的每个字符。
Input – alpha = "pppppp" Output – 1
解释
由于所有字符都相同,并且我们可以用“o”替换“p”,因此答案是 1。
方法 1
在这种方法中,我们将元音的位置存储在映射中以查找最接近的辅音。对于除了“a”之外的每个元音,都有两个选择用辅音替换字符。
此外,“c”、“g”、“l”和“r”辅音有两个选择用最接近的元音替换,而其他辅音只有一个选择。对于辅音,我们可以找到替换每个字符的选择,并将每个选择相乘以获得答案。基本上,这个问题非常类似于根据给定条件找到总排列。
算法
步骤 1 - 初始化“cnt”为 1 以存储答案。
步骤 2 - 将所有元音存储在“vowels”映射中,并带有其 0 为基的索引。
步骤 3 - 开始遍历字符串,并在“vowels”映射中查找字符。
步骤 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 for vowels 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++) { // For consonants if (vowels.find(alpha[p]) == vowels.end()) { int ch = alpha[p] - 'a'; // For c, g, l, and r consonants if (ch == 2 || ch == 6 || ch == 11 || ch == 17) cnt *= 2; } // For vowel else { // Each vowel has two choices except 'a' if (alpha[p] != 'a') cnt *= 2; } } return cnt; } int main() { string alpha = "abgd"; cout << "The total unique strings we can get by replacing the characters is " << calculateUniqueStrings(alpha) << endl; return 0; }
输出
The total unique strings we can get by replacing the characters is 2
时间复杂度 - O(N),用于替换字符串的每个字符。
空间复杂度 - O(1),因为我们没有使用任何额外的空间。
我们学习了如何通过用最近的元音或辅音替换字符串的每个字符来查找不同字符串的数量。程序员可以解决仅替换单个字符的问题,即计算可以形成的不同字符串的数量。