字符串题目:山羊拉丁文

文章目录

题目

标题和出处

标题:山羊拉丁文

出处: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 根据空格分隔成字符串数组,则字符串数组中的每个元素都是一个单词。

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

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

  1. 判断单词的首字母,如果首字母是元音字母则不做任何改变,如果首字母是辅音字母则将首字母从单词头部移到单词尾部;

  2. 在单词的后面添加 “ma" \text{``ma"} “ma";

  3. 对于数组下标为 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 类型的对象存储转换后的结果。

上一篇:【分治-前缀积后缀积】JS Window @2018acm徐州邀请赛G


下一篇:微信小程序之实现页面缩放式侧滑效果