使用C++程序将字符串中所有辅音替换为最近的元音


此方法旨在将辅音字符串替换为字母表中最接近的元音(也称为小写拉丁字母)。如果两个元音的距离相等,我们可以用这些字母中的第一个替换它们。

让我们来看一些输入场景:

假设我们有一个字符串,例如“ebgkjasjd”,现在我们需要将字符串中所有存在的辅音替换为最近的元音。

Input = "ebgkjasjd";
Result =
ebgkjasjd
eaeiiauie

以元素“b”为例,我们可以用“a”替换它,因为它是最近的元音。我们可以用“e”或“i”替换元素“g”,因为两者距离都相等,但我们用“e”替换它,因为它排在前面。字符串中所有其他元素也是如此。

假设输入字符串中没有任何元音,例如,考虑一个字符串:“sdfhgtykl”,则将获得以下结果:

Input = "sdfhgtykl";
Result =
sdfhgtykl
ueeieuuii

对于第一个元素“s”,元音“u”是最接近的,因此“s”被替换为“u”。数组中的所有其他元素也是如此,因为它们都是辅音。这种情况也产生了此方法的最坏情况复杂度。

算法

  • 从起始索引遍历输入字符串。

  • 如果遇到辅音,则计算从辅音到左右两个最近元音的字母数量。将选择字母数量较少的元音。

  • 重复此过程,直到遍历字符串中的所有辅音。

  • 获得的输出是替换后的字符串。

示例

以下是C++实现,用于将字符串中所有辅音替换为字母表中最接近的元音:

#include <iostream> using namespace std; void solve(string& s) { for(char &ch : s) { if(ch>'a' && ch<'e') { if(ch-'a' <= 'e'-ch) ch='a'; else ch='e'; } else if(ch>'e' && ch<'i') { if(ch-'e' <= 'i'-ch) ch='e'; else ch='i'; } else if(ch>'i' && ch<'o') { if(ch-'i' <= 'o'-ch) ch='i'; else ch='o'; } else if(ch>'o' && ch<'u') { if(ch-'o' <= 'u'-ch) ch='o'; else ch='u'; } else if(ch>'u') { ch = 'u'; } } } int main() { string s = "ibgshzjbsh"; cout << s << "\n"; solve(s); cout << s; return 0; }

输出

“ibgshzjbsh”
“iaeuiuiaui”

示例

但是,与其使用大量的if-else条件,更好的方法是使用数组并为每个字符存储最近字符的答案。

#include <iostream> #include <vector> using namespace std; string solve(string s) { string hash = "aaaeeeeiiiiioooooouuuuuuuu"; for (int i=0;i<s.size();i++) { s[i] = hash[s[i]-'a']; } return s; } int main() { string s = "ibgshzjbsh"; cout << solve(s); return 0; }

输出

iaeuiuiaui

结论

我们可以通过查找并用最近的字符替换元素来替换元素。遍历字符串一次即可获得O(n)的时间复杂度。第二种方法更容易理解和编码。这种方法的时间复杂度也是O(n),因为我们只遍历字符串一次。

更新于:2022年8月10日

1K+ 次浏览

启动您的职业生涯

完成课程获得认证

开始
广告