使用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+ 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.