文章目录
题目
标题和出处
标题:山羊拉丁文
出处:824. 山羊拉丁文
难度
2 级
题目描述
要求
给定一个由空格分割单词的句子 sentence \texttt{sentence} sentence。每个单词只包含大写或小写字母。
我们要将句子转换为「山羊拉丁文」(一种类似于「猪拉丁文」的虚构语言)。
山羊拉丁文的规则如下:
- 如果单词以元音(
‘A’
\texttt{`A'}
‘A’,
‘E’
\texttt{`E'}
‘E’,
‘I’
\texttt{`I'}
‘I’,
‘O’
\texttt{`O'}
‘O’,
‘U’
\texttt{`U'}
‘U’,
‘a’
\texttt{`a'}
‘a’,
‘e’
\texttt{`e'}
‘e’,
‘i’
\texttt{`i'}
‘i’,
‘o’
\texttt{`o'}
‘o’,
‘u’
\texttt{`u'}
‘u’)开头,在单词后添加
"ma"
\texttt{"ma"}
"ma"。
- 例如,单词 "apple" \texttt{"apple"} "apple" 变为 "applema" \texttt{"applema"} "applema"。
- 如果单词以辅音字母开头(即非元音字母),移除第一个字符并将它放到末尾,之后再添加
"ma"
\texttt{"ma"}
"ma"。
- 例如,单词 "goat" \texttt{"goat"} "goat" 变为 "oatgma" \texttt{"oatgma"} "oatgma"。
- 根据单词在句子中的索引,在单词最后添加与索引相同数量的字母
‘a’
\texttt{`a'}
‘a’,索引从
1
\texttt{1}
1 开始。
- 例如,在第一个单词后添加 "a" \texttt{"a"} "a",在第二个单词后添加 "aa" \texttt{"aa"} "aa",以此类推。
返回将 sentence \texttt{sentence} sentence 转换为山羊拉丁文后的句子。
示例
示例 1:
输入:
sentence
=
"I
speak
Goat
Latin"
\texttt{sentence = "I speak Goat Latin"}
sentence = "I speak Goat Latin"
输出:
"Imaa
peaksmaaa
oatGmaaaa
atinLmaaaaa"
\texttt{"Imaa peaksmaaa oatGmaaaa atinLmaaaaa"}
"Imaa peaksmaaa oatGmaaaa atinLmaaaaa"
示例 2:
输入:
sentence
=
"The
quick
brown
fox
jumped
over
the
lazy
dog"
\texttt{sentence = "The quick brown fox jumped over the lazy dog"}
sentence = "The quick brown fox jumped over the lazy dog"
输出:
"heTmaa
uickqmaaa
rownbmaaaa
oxfmaaaaa
umpedjmaaaaaa
overmaaaaaaa
hetmaaaaaaaa
azylmaaaaaaaaa
ogdmaaaaaaaaaa"
\texttt{"heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa"}
"heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa"
数据范围
- 1 ≤ sentence.length ≤ 150 \texttt{1} \le \texttt{sentence.length} \le \texttt{150} 1≤sentence.length≤150
- sentence \texttt{sentence} sentence 中仅包含大小写英语字母和空格
- sentence \texttt{sentence} sentence 的开头和结尾都不是空格
- sentence \texttt{sentence} sentence 中的单词之间有且仅有一个空格
解法
思路和算法
由于给定的字符串 sentence \textit{sentence} sentence 由空格分隔每个单词,因此首先需要得到字符串 sentence \textit{sentence} sentence 中的每个单词。在 Java 中, String \texttt{String} String 类型有 split \texttt{split} split 方法,将字符串根据指定的分隔符分隔成字符串数组。这道题中,将字符串 sentence \textit{sentence} sentence 根据空格分隔成字符串数组,则字符串数组中的每个元素都是一个单词。
得到每个单词以后,即可将句子中的每个单词转换成山羊拉丁文。
将每个单词转换成山羊拉丁文的操作如下:
-
判断单词的首字母,如果首字母是元音字母则不做任何改变,如果首字母是辅音字母则将首字母从单词头部移到单词尾部;
-
在单词的后面添加 “ma" \text{``ma"} “ma";
-
对于数组下标为 i i i 的单词,在单词的后面添加 i + 1 i + 1 i+1 个 “a" \text{``a"} “a"。
由于涉及到字符串的修改和拼接操作,因此使用 StringBuffer \texttt{StringBuffer} StringBuffer 类型。具体而言,创建 StringBuffer \texttt{StringBuffer} StringBuffer 类型的变量 goatLatin \textit{goatLatin} goatLatin 存储最终生成的山羊拉丁文,对于数组中的每个单词,分别创建一个 StringBuffer \texttt{StringBuffer} StringBuffer 类型的变量存储该单词的山羊拉丁文表示,然后将山羊拉丁文表示拼接到 goatLatin \textit{goatLatin} goatLatin 的末尾。
在拼接 goatLatin \textit{goatLatin} goatLatin 时,需要注意单词之间有空格,因此除了最后一个单词以外,在拼接每个单词时之后都需要加上一个空格。
代码
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';
}
}
复杂度分析
-
时间复杂度: O ( n 2 ) O(n^2) O(n2),其中 n n n 是字符串 sentence \textit{sentence} sentence 的长度。需要遍历字符串一次,由于转换成山羊拉丁文后的每个单词的长度与单词下标有关,因此整个句子的山羊拉丁文的长度为 O ( n 2 ) O(n^2) O(n2),生成山羊拉丁文的时间复杂度为 O ( n 2 ) O(n^2) O(n2)。
-
空间复杂度: O ( n 2 ) O(n^2) O(n2),其中 n n n 是字符串 sentence \textit{sentence} sentence 的长度。需要创建一个 StringBuffer \texttt{StringBuffer} StringBuffer 类型的对象存储转换后的结果。