题目
标题和出处
标题:山羊拉丁文
出处:824. 山羊拉丁文
难度
2 级
题目描述
要求
给定一个由空格分割单词的句子 。每个单词只包含大写或小写字母。
我们要将句子转换为「山羊拉丁文」(一种类似于「猪拉丁文」的虚构语言)。
山羊拉丁文的规则如下:
- 如果单词以元音(
,
,
,
,
,
,
,
,
,
)开头,在单词后添加
。
- 例如,单词
变为
。
- 例如,单词
- 如果单词以辅音字母开头(即非元音字母),移除第一个字符并将它放到末尾,之后再添加
。
- 例如,单词
变为
。
- 例如,单词
- 根据单词在句子中的索引,在单词最后添加与索引相同数量的字母
,索引从
开始。
- 例如,在第一个单词后添加
,在第二个单词后添加
,以此类推。
- 例如,在第一个单词后添加
返回将 转换为山羊拉丁文后的句子。
示例
示例 1:
输入:
输出:
示例 2:
输入:
输出:
数据范围
中仅包含大小写英语字母和空格
的开头和结尾都不是空格
中的单词之间有且仅有一个空格
解法
思路和算法
由于给定的字符串 由空格分隔每个单词,因此首先需要得到字符串
中的每个单词。在 Java 中,
类型有
方法,将字符串根据指定的分隔符分隔成字符串数组。这道题中,将字符串
根据空格分隔成字符串数组,则字符串数组中的每个元素都是一个单词。
得到每个单词以后,即可将句子中的每个单词转换成山羊拉丁文。
将每个单词转换成山羊拉丁文的操作如下:
- 判断单词的首字母,如果首字母是元音字母则不做任何改变,如果首字母是辅音字母则将首字母从单词头部移到单词尾部;
- 在单词的后面添加
;
- 对于数组下标为
的单词,在单词的后面添加
个
。
由于涉及到字符串的修改和拼接操作,因此使用 类型。具体而言,创建
类型的变量
存储最终生成的山羊拉丁文,对于数组中的每个单词,分别创建一个
类型的变量存储该单词的山羊拉丁文表示,然后将山羊拉丁文表示拼接到
的末尾。
在拼接 时,需要注意单词之间有空格,因此除了最后一个单词以外,在拼接每个单词时之后都需要加上一个空格。
代码
class Solution {public String toGoatLatin(String sentence) {StringBuffer goatLatin = new StringBuffer();String[] array = sentence.split(" ");int length = array.length;for (int i = 0; i < length; i++) {String word = array[i];StringBuffer sb = new StringBuffer();if (isVowel(word.charAt(0))) {sb.append(word);} else {sb.append(word.substring(1));sb.append(word.charAt(0));}sb.append("ma");for (int j = 0; j <= i; j++) {sb.append('a');}goatLatin.append(sb);if (i < length - 1) {goatLatin.append(' ');}}return goatLatin.toString();}public boolean isVowel(char c) {return c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U' || c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';}}
复杂度分析
- 时间复杂度:
#card=math&code=O%28n%5E2%29&id=MczGX),其中
是字符串
的长度。需要遍历字符串一次,由于转换成山羊拉丁文后的每个单词的长度与单词下标有关,因此整个句子的山羊拉丁文的长度为
#card=math&code=O%28n%5E2%29&id=Rglof),生成山羊拉丁文的时间复杂度为
#card=math&code=O%28n%5E2%29&id=PNVRT)。
- 空间复杂度:
#card=math&code=O%28n%5E2%29&id=sIi2s),其中
是字符串
的长度。需要创建一个
类型的对象存储转换后的结果。
