Talentd
FleetCode
Make and follow sheets.Sign in

Goat Latin solution and explanation

EasyString5 min read69.9% acceptanceUpdated 9 Apr 2026
LeetCode Goat Latin Solution Explained - JavaNick White · 5:53 · 3K viewsWatch on YouTube
9 more videos on this problem
  1. LeetCode Goat Latin Solution Explained - JavaNick White · 5:53 · 3K views
  2. Goat Latin | LeetCode 824 | C++, Java, PythonKnowledge Center · 13:37 · 2K views
  3. GOAT LATIN | LEETCODE 824 | PYTHON SOLUTIONCracking FAANG · 8:55 · 1K views
  4. Goat Latin | leetcode 824 | HindiCodebix · 15:42 · 904 views
  5. Goat Latin | Leet code 824 | Theory explained + Python codeSai Anish Malla · 5:19 · 496 views
  6. goat latin leetcode | leetcode 824 | goat latin leetcode javaNaresh Gupta · 6:13 · 488 views
  7. Leetcode - Goat Latin (Python)Timothy H Chang · 5:01 · 440 views
  8. 824. Goat Latin || LEETCODE SOLUTION || IN C++ || DATA STRUCTURE AND ALGORITHMAbhishweta Gupta · 4:49 · 340 views
  9. 824. Goat Latin | LEETCODE EASYcode Explainer · 8:33 · 239 views
  10. 824. Goat Latin (Leetcode Easy)Programming Live with Larry · 5:20 · 191 views

The problem

You are given a string sentence that consist of words separated by spaces. Each word consists of lowercase and uppercase letters only.

We would like to convert the sentence to "Goat Latin" (a made-up language similar to Pig Latin.) The rules of Goat Latin are as follows:

  • If a word begins with a vowel ('a', 'e', 'i', 'o', or 'u'), append "ma" to the end of the word.
    • For example, the word "apple" becomes "applema".
  • If a word begins with a consonant (i.e., not a vowel), remove the first letter and append it to the end, then add "ma".
    • For example, the word "goat" becomes "oatgma".
  • Add one letter 'a' to the end of each word per its word index in the sentence, starting with 1.
    • For example, the first word gets "a" added to the end, the second word gets "aa" added to the end, and so on.

Return the final sentence representing the conversion from sentence to Goat Latin.

Example 1:

Input: sentence = "I speak Goat Latin"
Output: "Imaa peaksmaaa oatGmaaaa atinLmaaaaa"

Example 2:

Input: sentence = "The quick brown fox jumped over the lazy dog"
Output: "heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa"

Constraints:

  • 1 <= sentence.length <= 150
  • sentence consists of English letters and spaces.
  • sentence has no leading or trailing spaces.
  • All the words in sentence are separated by a single space.

Approach overview

Problem Overview: You are given a sentence and must convert every word into "Goat Latin" following a set of transformation rules. Words starting with vowels keep their order, while words starting with consonants move the first letter to the end. Each word also gets "ma" plus an increasing number of 'a' characters based on its position.

Approach 1: String Manipulation with Direct Index Modifications (O(n) time, O(n) space)

Split the sentence into individual words, then process them sequentially. For each word, check the first character against a vowel set (a, e, i, o, u in both cases). If the first letter is a consonant, move it to the end using substring or slicing operations. Append "ma" and a sequence of 'a' characters equal to the word's index (1-based). Join the processed words back into a sentence. This approach relies entirely on basic string operations and iteration, making it straightforward and easy to implement in languages like Python or JavaScript.

Approach 2: Using StringBuilder for Efficient String Manipulation (O(n) time, O(n) space)

Languages like Java and C# benefit from StringBuilder because repeated string concatenation can create many intermediate strings. Iterate through the words after splitting the sentence, then build each transformed word using a StringBuilder. Append characters conditionally depending on whether the word starts with a vowel or consonant, followed by "ma" and the appropriate number of 'a' characters. Using a builder avoids repeated allocations and keeps the transformation linear relative to the total input size. The logic is still pure string processing, but with more efficient memory handling.

Both approaches follow the same transformation logic. The difference lies in how strings are constructed. Direct concatenation works well in scripting languages where string operations are optimized, while builder-based approaches are preferred in strongly typed languages with immutable string objects.

Recommended for interviews: The direct string manipulation approach is usually expected first. It clearly demonstrates that you can parse sentences, handle character checks, and apply transformation rules step by step. If coding in Java or C#, interviewers often expect the StringBuilder variation to avoid inefficient concatenation. The key skill being tested is practical string manipulation and careful rule implementation rather than complex algorithms.

Approach 1: String Manipulation with Direct Index Modifications

Converting a sentence to Goat Latin involves directly modifying each word according to rules based on their starting letter (vowel or consonant) and their position in the sentence list. We iterate over each word in the sentence, apply the specific transformations, and finally reconstruct the sentence.



def to_goat_latin(sentence: str) -> str:
    vowels = 'aeiouAEIOU'
    words = sentence.split()
    goat_latin = []

    for index, word in enumerate(words):
        if word[0] in vowels:
            goat_word = word + 'ma'
        else:
            goat_word = word[1:] + word[0] + 'ma'
        goat_word += 'a' * (index + 1)

        goat_latin.append(goat_word)

    return ' '.join(goat_latin)

# Example usage:
sentence = "I speak Goat Latin"
print(to_goat_latin(sentence))  # Output: "Imaa peaksmaaa oatGmaaaa atinLmaaaaa"

function toGoatLatin(sentence) {
    const vowels = new Set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']);
    const words = sentence.split(' ');
    const goatLatinWords = words.map((word, index) => {
        let result = word;
        if (!vowels.has(word[0])) {
            result = word.slice(1) + word[0];
        }
        result += 'ma' + 'a'.repeat(index + 1);
        return result;
    });
    return goatLatinWords.join(' ');
}
// Example usage:
console.log(toGoatLatin("I speak Goat Latin")); // Output: "Imaa peaksmaaa oatGmaaaa atinLmaaaaa"

The Python solution uses a straightforward approach: it first checks if the word starts with a vowel. If it does, 'ma' is appended. If not, the first letter is moved to the end before appending 'ma'. Afterwards, 'a' characters are appended based on the word's position index. Each word is then gathered into a list and joined into the final sentence.

Complexity

Time Complexity: O(n) where n is the number of characters in the sentence, because each character is processed once.
Space Complexity: O(n) required for the words list.

Try this approach in the editor

Approach 2: Using StringBuilder for Efficient String Manipulation

This approach leverages StringBuilder (in languages where it is available) to efficiently build the result string, managing memory and time complexity by reducing intermediate operations.


public class GoatLatin {
    public static String toGoatLatin(String sentence) {
        String[] words = sentence.split(" ");
        StringBuilder result = new StringBuilder();
        String vowels = "aeiouAEIOU";
        for (int i = 0; i < words.length; i++) {
            StringBuilder wordBuilder = new StringBuilder(words[i]);
            if (vowels.indexOf(wordBuilder.charAt(0)) == -1) {
                char firstChar = wordBuilder.charAt(0);
                wordBuilder.deleteCharAt(0);
                wordBuilder.append(firstChar);
            }
            wordBuilder.append("ma");
            for (int j = 0; j <= i; j++) {
                wordBuilder.append('a');
            }
            result.append(wordBuilder).append(" ");
        }
        return result.toString().trim();
    }
    public static void main(String[] args) {
        System.out.println(toGoatLatin("I speak Goat Latin"));  // Output: "Imaa peaksmaaa oatGmaaaa atinLmaaaaa"
    }
}

public class GoatLatin {
    public static string ToGoatLatin(string sentence) {
        var words = sentence.Split(' ');
        var vowelSet = new HashSet<char> {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'};
        var result = new StringBuilder();

        for (int i = 0; i < words.Length; i++) {
            string word = words[i];
            if (!vowelSet.Contains(word[0])) {
                word = word.Substring(1) + word[0];
            }
            result.Append(word).Append("ma").Append(new string('a', i + 1)).Append(' ');
        }

        return result.ToString().Trim();
    }

    public static void Main() {
        Console.WriteLine(ToGoatLatin("I speak Goat Latin")); // Output: "Imaa peaksmaaa oatGmaaaa atinLmaaaaa"
    }
}

In the Java solution, a StringBuilder is used to construct each word and the final sentence efficiently. For each word, we use character checks on the first character to determine consonant handling or vowel treatment and then build each word part by part.

Complexity

Time Complexity: O(n) due to single-pass string operations and constructions.
Space Complexity: O(n) for storing transitory character builds and the final sentence.

Try this approach in the editor

Approach 3: Default Approach

function toGoatLatin(sentence: string): string {
    return sentence
        .split(' ')
        .map((s, i) => {
            let startStr: string;
            if (/[aeiou]/i.test(s[0])) {
                startStr = s;
            } else {
                startStr = s.slice(1) + s[0];
            }
            return `${startStr}ma${'a'.repeat(i + 1)}`;
        })
        .join(' ');
}
use std::collections::HashSet;
impl Solution {
    pub fn to_goat_latin(sentence: String) -> String {
        let set: HashSet<&char> = ['a', 'e', 'i', 'o', 'u'].into_iter().collect();
        sentence
            .split_whitespace()
            .enumerate()
            .map(|(i, s)| {
                let first = char::from(s.as_bytes()[0]);
                let mut res = if set.contains(&first.to_ascii_lowercase()) {
                    s.to_string()
                } else {
                    s[1..].to_string() + &first.to_string()
                };
                res.push_str("ma");
                res.push_str(&"a".repeat(i + 1));
                res
            })
            .into_iter()
            .collect::<Vec<String>>()
            .join(" ")
    }
}
Try this approach in the editor

Complexity comparison

ApproachComplexity
String Manipulation with Direct Index Modifications

Time Complexity: O(n) where n is the number of characters in the sentence, because each character is processed once.
Space Complexity: O(n) required for the words list.

Using StringBuilder for Efficient String Manipulation

Time Complexity: O(n) due to single-pass string operations and constructions.
Space Complexity: O(n) for storing transitory character builds and the final sentence.

Default Approach–

Complexity analysis

ApproachTimeSpaceWhen to Use
String Manipulation with Direct Index ModificationsO(n)O(n)Best for Python or JavaScript where string slicing and concatenation are efficient and code readability matters.
Using StringBuilder for Efficient String ManipulationO(n)O(n)Preferred in Java or C# to avoid repeated string allocations during concatenation.

Frequently asked questions

Is Goat Latin easy or hard?

Goat Latin is classified as an Easy problem on LeetCode with an acceptance rate close to 70%. The challenge lies in carefully applying multiple transformation rules while iterating through the sentence.

Goat Latin Python/Java solution

Python solutions typically use string slicing and list joins to transform each word efficiently. Java implementations often rely on StringBuilder to construct the output string while applying the Goat Latin rules step by step.

How to solve Goat Latin in O(n)?

Iterate through the words of the sentence once. For each word, check the first character, modify the word according to Goat Latin rules, append 'ma', and add a sequence of 'a' characters based on the word's index. Since every character is processed only once while constructing the result, the total complexity remains O(n).

What is the best approach for Goat Latin?

The most practical approach uses direct string manipulation. Split the sentence into words, check whether each word starts with a vowel or consonant, apply the Goat Latin transformation rules, and append the correct number of 'a' characters. This runs in O(n) time where n is the total number of characters in the sentence.

Is Goat Latin asked at Google/Amazon/Meta?

Goat Latin is categorized as an easy string manipulation problem and appears mainly in early interview rounds or online assessments. It helps evaluate basic string handling, iteration, and attention to detail rather than complex algorithm design.

What data structure is used in Goat Latin?

The solution primarily relies on string processing and arrays of words obtained from splitting the sentence. Some implementations also use a vowel set for quick character checks and a StringBuilder to efficiently build the result string.

What is the time complexity of Goat Latin?

The time complexity is O(n), where n represents the total number of characters in the sentence. Each character is processed a constant number of times while building the transformed words. Space complexity is also O(n) because a new transformed sentence is constructed.

Comments

Now write it yourselfClose this page and solve Goat Latin in the editor, without looking.
Practise Goat Latin