Leetcode 824 山羊拉丁文
阿新 • • 發佈:2022-04-21
LC 824 山羊拉丁文
題目描述
給你一個由若干單片語成的句子 sentence ,單詞間由空格分隔。每個單詞僅由大寫和小寫英文字母組成。
請你將句子轉換為 “山羊拉丁文(Goat Latin)”(一種類似於 豬拉丁文 - Pig Latin 的虛構語言)。山羊拉丁文的規則如下:
- 如果單詞以母音開頭(
'a'
,'e'
,'i'
,'o'
,'u'
),在單詞後新增"ma"
。- 例如,單詞
"apple"
變為"applema"
。
- 例如,單詞
-
如果單詞以子音字母開頭(即,非母音字母),移除第一個字元並將它放到末尾,之後再新增"ma"。
- 例如,單詞 "goat" 變為 "oatgma" 。
-
根據單詞在句子中的索引,在單詞最後新增與索引相同數量的字母'a',索引從 1 開始。
- 例如,在第一個單詞後新增 "a" ,在第二個單詞後新增 "aa" ,以此類推。
返回將 sentence
轉換為山羊拉丁文後的句子。
示例 1:
輸入:sentence = "I speak Goat Latin"
輸出:"Imaa peaksmaaa oatGmaaaa atinLmaaaaa"
示例 2:
輸入:sentence = "The quick brown fox jumped over the lazy dog" 輸出:"heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa"
題意
給定一個字串, 處理每個單詞,一共三種做法
- 如果單詞首字母為母音,則在單詞尾部加上"ma"。例如:"apple"->"applema"
- 如果單詞首字母不為母音, 則將單詞首字母挪到單詞末尾拼接, 再在尾部新增"ma"。例: "peach" -> "eachpma"。
- 不管單詞字母是母音或者子音,在做完上述操作後可以針對單詞下標進行操作,如果單詞下標為1, 則進行操作1或2後要加上對應下標數量的a。例:"I am peach" -> I下標為1,且執行操作1, I + "ma" + "a" -> "Imaa", am下標為2, 且執行操作1, am + "ma" + "aa" -> "ammaaa", peach下標為3, 且執行操作2, peach -> eachp + "ma" + "aaa" -> "eachpmaaaa
做法
O(n)模擬
: 資料範圍並不大,比較麻煩處理的是分割單詞以及單詞對應下標。可以設定一個字串word記錄當前單詞,在遇到空格前一直給字串word累加,那麼遇到空格後,我們判定字串不為空的情況下去判斷首字母是否為母音, 母音則執行操作1再執行操作3,否則執行操作2再執行操作3, 在執行完操作後,我們設定給定加在尾部對應的下標字串"a", 進行累加, 即遇到一個單詞後加入到尾部後更新"aa", 這樣處理需要對最後一個單詞進行特判,迴圈一遍字串後,判斷單詞字串word是否為空,不為空則依舊進行操作1or2後再加上下標字串"a"即可。
class Solution {
public:
string toGoatLatin(string s) {
string res = "";
string word = "";
string tail = "a";
string dict = "aeiouAEIOU";
for (int i = 0; i < s.size(); i ++) {
if (s[i] == ' ') {
if (word.size()) { // 判斷確實存在單詞
if (dict.find(word[0]) == -1) // 判斷單詞首字母是否為母音
word += word[0], word.erase(word.begin()); // 對子音的處理
res += word;
res += "ma";
res += tail;
res += " ";
tail += "a";
}
word = ""; //將word釋放,用於記錄下一個單詞
} else {
word += s[i];
}
}
// 對句子中最後一個單詞進行處理,因為最後一個單詞不會遇到空格
if (word.size()) {
if (dict.find(word[0]) == -1)
word += word[0], word.erase(word.begin()); // 對子音的處理
res += word;
res += "ma";
res += tail;
}
return res;
}
};