山羊拉丁文

96 阅读3分钟

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

一、题目

leetcode 山羊拉丁文

给你一个由若干单词组成的句子 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 <= sentence.length <= 150
sentence 由英文字母和空格组成
sentence 不含前导或尾随空格
sentence 中的所有单词由单个空格分隔

二、题解

就是需要将一个英文单词句子根据规则转换为山羊拉丁文。

方法一

直接根据规则来对每一个单词进行处理即可。直接找到每一个单词,然后判断单词的首字母是不是元音,如果是的话就需要在单词后面追加"ma",否则就需要将单词的第一个字母移动到单词的末尾,最后还需要在单词后面添加n个字母"a",是第几个单词就需要添加几个"a"。具体的先使用一个字符串保存那些元音字母,用来判断单词的第一个字母是否为元音开头,因为单词是由大写和小写字母组成的,所以我们也要讲元音字母的大小写也保存。然后我们遍历字符串sentence去找到每一个单词,或者因为单词之间是由空格组成所以也可以按空格分隔字符串sentence得到一个单词数组。我们遍历字符串的话需要使用一个指针p指向一个单词末尾,p指针从位置单词首字母i位置开始往后移动直到遇到空格字符,或者到达sentence字符串末尾停止,这时位置i到位置p为一个完整的单词,然后判断单词首字母即位置i处的字母是否为元音,如果不是需要将单词首字母外的部分先添加到goatLatin字符串,然后在追加上单词的首字母;否则可以直接添加整个单词到goatLatin字符串。然后要用一个字符串a保存要添加的"a"字母,每获取一个单词就追加一个"a"字母,最后我们把goatLatin字符串追加上"ma",以及若干个"a"的字符串a,如果后面还有单词我们还需要添加一个空格来隔开每一个单词,最后继续获取下一个单词,最后返回goatLatin字符串。

三、代码 方法一 Java代码

class Solution {
    public String toGoatLatin(String sentence) {
        int length = sentence.length();
        String vowel = "aeiouAEIOU";
        StringBuilder goatLatin = new StringBuilder();
        StringBuilder a = new StringBuilder();
        for (int i = 0; i < length; i++) {
            int p = i;
            while (p < length && sentence.charAt(p) != ' ') {
                p++;
            }
            if (vowel.indexOf(sentence.charAt(i)) != -1) {
                goatLatin.append(sentence, i, p);
            } else {
                goatLatin.append(sentence, i + 1, p).append(sentence.charAt(i));
            }
            a.append("a");
            goatLatin.append("ma").append(a);
            if (p < length) {
                goatLatin.append(" ");
            }
            i = p;
        }
        return goatLatin.toString();
    }
}

时间复杂度:O(n),需要遍历获取每一个单词。

空间复杂度:O(n),需要一个返回的山羊拉丁文字符串,以及若干个追加字符串"a"。