山羊拉丁文

标签: 字符串

难度: Easy

给你一个由若干单词组成的句子 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 中的所有单词由单个空格分隔

Submission

运行时间: 23 ms

内存: 16.0 MB

class Solution:
    def toGoatLatin(self, sentence: str) -> str:
        words = sentence.split(" ")
        vowels = set('a')
        vowels.add('e')
        vowels.add('i')
        vowels.add('o')
        vowels.add('u')
        vowels.add('A')
        vowels.add('E')
        vowels.add('O')
        vowels.add('I')
        vowels.add('U')
        for i in range(len(words)):
            if words[i][0] in vowels:
                words[i] += "ma"+ "a"*(i+1)
            else:
                words[i] = words[i][1:] + words[i][0] + "ma" + "a"*(i+1)
        return " ".join(words)

Explain

这个题解采用直接遍历和处理每个单词的方法,将输入的句子拆分为单词列表。对于每个单词,首先检查其首字母是否为元音,元音和辅音字母的判定通过一个预设的集合来进行。如果单词首字母是元音,直接在单词后添加'ma'和索引数量的'a'字符;如果首字母是辅音,则移除首字母,添加到单词末尾,再添加'ma'和索引数量的'a'字符。最后将处理后的单词列表用空格拼接成一个新的字符串作为结果返回。

时间复杂度: O(n + k*m)

空间复杂度: O(n + m)

class Solution:
    def toGoatLatin(self, sentence: str) -> str:
        words = sentence.split(' ')  # 将句子拆分为单词列表
        vowels = set('aeiouAEIOU')  # 预定义元音字母集
        for i in range(len(words)):
            if words[i][0] in vowels:  # 如果首字母是元音
                words[i] += 'ma' + 'a' * (i + 1)  # 直接添加'ma'和递增的'a'
            else:  # 首字母是辅音
                words[i] = words[i][1:] + words[i][0] + 'ma' + 'a' * (i + 1)  # 移动首字母,添加'ma'和递增的'a'
        return ' '.join(words)  # 拼接处理后的单词列表为字符串

Explore

在提供的代码实现中,并没有显式地检查单词是否只包含英文字母。因此,如果输入包含数字或标点符号,这些字符会被当作单词的一部分来处理。在实际应用中,如果需要确保只处理由英文字母组成的单词,可以在处理之前添加一个过滤步骤,例如使用正则表达式来验证每个单词只包含字母。

此算法会将空格作为分隔符来拆分输入的句子。如果输入为空句子或只包含空格,split(' ')方法将返回一个包含空字符串的列表。因此,处理这样的输入不会导致错误,但会返回一个或多个由'ma'和相应数量的'a'字符组成的单词,这可能不是期望的结果。可以通过在处理之前检查每个单词是否为空来改进算法,以避免生成无意义的输出。

选择在单词后添加'ma'这一规则是题目要求的一部分,而非出于算法效率考虑。这是根据题目设定的特定规则来模拟“山羊拉丁文”的转换过程。在实际算法设计中,添加的字符串可以是任意的,而这里选择'ma'是为了满足题目的具体要求。

使用加号 (+) 进行字符串拼接在Python中是有效的,但在处理大量数据或长字符串时效率可能不高,因为每次使用加号时都会创建新的字符串对象。更高效的方法是使用列表来收集字符串,然后使用join()方法一次性将它们连接起来。在此解法中,虽然对每个单词使用了加号,但最终是通过join()将处理好的单词列表拼接成结果字符串,这种方式在效率上是可以接受的。