Leetcode 824 山羊拉丁文
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;
}
};