首页 > 技术文章 > Leetcode 824 山羊拉丁文

Lilyan 2022-04-21 16:27 原文

LC 824 山羊拉丁文

题目描述

Link

给你一个由若干单词组成的句子 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"

题意

给定一个字符串, 处理每个单词,一共三种做法

  1. 如果单词首字母为元音,则在单词尾部加上"ma"。例如:"apple"->"applema"
  2. 如果单词首字母不为元音, 则将单词首字母挪到单词末尾拼接, 再在尾部添加"ma"。例: "peach" -> "eachpma"。
  3. 不管单词字母是元音或者辅音,在做完上述操作后可以针对单词下标进行操作,如果单词下标为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;
    }
};

推荐阅读