题目

标题和出处

标题:山羊拉丁文

出处:824. 山羊拉丁文

难度

2 级

题目描述

要求

给定一个由空格分割单词的句子 字符串题目:山羊拉丁文 - 图1。每个单词只包含大写或小写字母。

我们要将句子转换为「山羊拉丁文」(一种类似于「猪拉丁文」的虚构语言)。

山羊拉丁文的规则如下:

  • 如果单词以元音(字符串题目:山羊拉丁文 - 图2字符串题目:山羊拉丁文 - 图3字符串题目:山羊拉丁文 - 图4字符串题目:山羊拉丁文 - 图5字符串题目:山羊拉丁文 - 图6字符串题目:山羊拉丁文 - 图7字符串题目:山羊拉丁文 - 图8字符串题目:山羊拉丁文 - 图9字符串题目:山羊拉丁文 - 图10字符串题目:山羊拉丁文 - 图11)开头,在单词后添加 字符串题目:山羊拉丁文 - 图12
    • 例如,单词 字符串题目:山羊拉丁文 - 图13 变为 字符串题目:山羊拉丁文 - 图14
  • 如果单词以辅音字母开头(即非元音字母),移除第一个字符并将它放到末尾,之后再添加 字符串题目:山羊拉丁文 - 图15
    • 例如,单词 字符串题目:山羊拉丁文 - 图16 变为 字符串题目:山羊拉丁文 - 图17
  • 根据单词在句子中的索引,在单词最后添加与索引相同数量的字母 字符串题目:山羊拉丁文 - 图18,索引从 字符串题目:山羊拉丁文 - 图19 开始。
    • 例如,在第一个单词后添加 字符串题目:山羊拉丁文 - 图20,在第二个单词后添加 字符串题目:山羊拉丁文 - 图21,以此类推。

返回将 字符串题目:山羊拉丁文 - 图22 转换为山羊拉丁文后的句子。

示例

示例 1:

输入:字符串题目:山羊拉丁文 - 图23
输出:字符串题目:山羊拉丁文 - 图24

示例 2:

输入:字符串题目:山羊拉丁文 - 图25
输出:字符串题目:山羊拉丁文 - 图26

数据范围

  • 字符串题目:山羊拉丁文 - 图27
  • 字符串题目:山羊拉丁文 - 图28 中仅包含大小写英语字母和空格
  • 字符串题目:山羊拉丁文 - 图29 的开头和结尾都不是空格
  • 字符串题目:山羊拉丁文 - 图30 中的单词之间有且仅有一个空格

解法

思路和算法

由于给定的字符串 字符串题目:山羊拉丁文 - 图31 由空格分隔每个单词,因此首先需要得到字符串 字符串题目:山羊拉丁文 - 图32 中的每个单词。在 Java 中,字符串题目:山羊拉丁文 - 图33 类型有 字符串题目:山羊拉丁文 - 图34 方法,将字符串根据指定的分隔符分隔成字符串数组。这道题中,将字符串 字符串题目:山羊拉丁文 - 图35 根据空格分隔成字符串数组,则字符串数组中的每个元素都是一个单词。

得到每个单词以后,即可将句子中的每个单词转换成山羊拉丁文。

将每个单词转换成山羊拉丁文的操作如下:

  1. 判断单词的首字母,如果首字母是元音字母则不做任何改变,如果首字母是辅音字母则将首字母从单词头部移到单词尾部;
  2. 在单词的后面添加 字符串题目:山羊拉丁文 - 图36
  3. 对于数组下标为 字符串题目:山羊拉丁文 - 图37 的单词,在单词的后面添加 字符串题目:山羊拉丁文 - 图38字符串题目:山羊拉丁文 - 图39

由于涉及到字符串的修改和拼接操作,因此使用 字符串题目:山羊拉丁文 - 图40 类型。具体而言,创建 字符串题目:山羊拉丁文 - 图41 类型的变量 字符串题目:山羊拉丁文 - 图42 存储最终生成的山羊拉丁文,对于数组中的每个单词,分别创建一个 字符串题目:山羊拉丁文 - 图43 类型的变量存储该单词的山羊拉丁文表示,然后将山羊拉丁文表示拼接到 字符串题目:山羊拉丁文 - 图44 的末尾。

在拼接 字符串题目:山羊拉丁文 - 图45 时,需要注意单词之间有空格,因此除了最后一个单词以外,在拼接每个单词时之后都需要加上一个空格。

代码

  1. class Solution {
  2. public String toGoatLatin(String sentence) {
  3. StringBuffer goatLatin = new StringBuffer();
  4. String[] array = sentence.split(" ");
  5. int length = array.length;
  6. for (int i = 0; i < length; i++) {
  7. String word = array[i];
  8. StringBuffer sb = new StringBuffer();
  9. if (isVowel(word.charAt(0))) {
  10. sb.append(word);
  11. } else {
  12. sb.append(word.substring(1));
  13. sb.append(word.charAt(0));
  14. }
  15. sb.append("ma");
  16. for (int j = 0; j <= i; j++) {
  17. sb.append('a');
  18. }
  19. goatLatin.append(sb);
  20. if (i < length - 1) {
  21. goatLatin.append(' ');
  22. }
  23. }
  24. return goatLatin.toString();
  25. }
  26. public boolean isVowel(char c) {
  27. return c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U' || c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
  28. }
  29. }

复杂度分析

  • 时间复杂度:字符串题目:山羊拉丁文 - 图46#card=math&code=O%28n%5E2%29&id=MczGX),其中 字符串题目:山羊拉丁文 - 图47 是字符串 字符串题目:山羊拉丁文 - 图48 的长度。需要遍历字符串一次,由于转换成山羊拉丁文后的每个单词的长度与单词下标有关,因此整个句子的山羊拉丁文的长度为 字符串题目:山羊拉丁文 - 图49#card=math&code=O%28n%5E2%29&id=Rglof),生成山羊拉丁文的时间复杂度为 字符串题目:山羊拉丁文 - 图50#card=math&code=O%28n%5E2%29&id=PNVRT)。
  • 空间复杂度:字符串题目:山羊拉丁文 - 图51#card=math&code=O%28n%5E2%29&id=sIi2s),其中 字符串题目:山羊拉丁文 - 图52 是字符串 字符串题目:山羊拉丁文 - 图53 的长度。需要创建一个 字符串题目:山羊拉丁文 - 图54 类型的对象存储转换后的结果。