【LeetCode每日一题】824. 山羊拉丁文

98 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

LeetCode每日一题打卡专栏正式启动!不出意外将日更LeetCode的每日一题,敬请期待。

个人博客链接:bbstudy.net/ (等毕业论文做好后续会完善相关功能)

4.21:山羊拉丁文

LeetCode 824,点击题目可直接跳转至LeetCode

题解:模拟

直接按照题意模拟即可。通过一次遍历便可按照题意输出想要的结果

  • 元音字母包含大小写10个
  • 如果此时遍历的是单词的第一个字母,且为辅音字母,则直接跳过(因为该字母需要加入到单词末尾)
  • 如果此时遍历的空格,则表示此时已经遍历了一个单词,按照题目要求进行相应的操作(如果单词第一个字母为辅音字母则加入到末尾;然后加入对应数量的字母a)

可以发现,这样处理对于最后一个单词不是很友好,因为末尾没有空格,为了方便处理,可以在末尾加入一个空格,直接一步到位。

官方题解时间复杂度为O(n2)O(n^2),此思路时间复杂度为O(n)O(n)

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;
    }
};