一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
LeetCode每日一题打卡专栏正式启动!不出意外将日更LeetCode的每日一题,敬请期待。
个人博客链接:bbstudy.net/ (等毕业论文做好后续会完善相关功能)
4.21:山羊拉丁文
LeetCode 824,点击题目可直接跳转至LeetCode
题解:模拟
直接按照题意模拟即可。通过一次遍历便可按照题意输出想要的结果
- 元音字母包含大小写10个
- 如果此时遍历的是单词的第一个字母,且为辅音字母,则直接跳过(因为该字母需要加入到单词末尾)
- 如果此时遍历的空格,则表示此时已经遍历了一个单词,按照题目要求进行相应的操作(如果单词第一个字母为辅音字母则加入到末尾;然后加入对应数量的字母a)
可以发现,这样处理对于最后一个单词不是很友好,因为末尾没有空格,为了方便处理,可以在末尾加入一个空格,直接一步到位。
官方题解时间复杂度为,此思路时间复杂度为
C++代码:
class Solution {
public:
string str="aeiouAEIOU";
bool check(char c){
for(int i=0;i<10;i++) if(c==str[i]) return true;
return false;
}
string toGoatLatin(string s) {
//为了方便处理最后一个单词,所以在字符串末尾添加' '
s+=' ';
int n=s.length();
string ans="";
int cnt=0; //记录单词在句子中的索引
int pos=0; //记录当前遍历的单词第一个字母位置
for(int i=0;i<n;i++){
if(i==pos && !check(s[i])){//单词以辅音字母开头
continue;
}
if(s[i]==' '){
++cnt;
if(!check(s[pos])) ans+=s[pos]; //如果第一个字母是辅音字母则加入到末尾
ans+="ma";
for(int j=0;j<cnt;j++) ans+='a';
pos=i+1; //更新pos
}
if(i!=n-1) ans+=s[i];
}
return ans;
}
};