BackmediumStringsSwiggy

Galactic Translator 2 Solution

Problem Statement

Given a lowercase English string s, produce a new string t by applying two operations in order. First, replace every vowel ('a','e','i','o','u') with the next vowel in the cyclic sequence a→e→i→o→u→a; consonants remain unchanged. Second, reverse the entire resulting string. Output t. The transformation must be performed in linear time relative to the length of s.

Example 1
Input
hello
Output
allih

Explanation: Original: h e l l o → shift vowels: e→i, o→a → "hilla" → reverse: "allih".

Example 2
Input
galaxy
Output
yxeleg

Explanation: Original: g a l a x y → shift vowels: a→e, a→e → "gelexy" → reverse: "yxeleg".

Example 3
Input
ufo
Output
afa

Explanation: Original: u f o → shift vowels: u→a, o→a → "afa" → reverse (same): "afa".

Constraints

  • 1 <= s.length <= 100000
  • s consists only of lowercase English letters
  • Time complexity must be O(|s|)
  • Auxiliary space must be O(1) besides the output string
Live Compiler1 Free Run Available
Loading Editor...
Test Cases & Output
Click "Run" to test your 1 free compile trial!

🚀 Practice this problem

Run code, get AI hints & track streak

Sign Up Free

Galactic Translator 2 — Problem Statement & Solution Guide

StringsMediumMixed
TimeO(n)
|
SpaceO(n)

Problem Description

Given a lowercase English string s, produce a new string t by applying two operations in order. First, replace every vowel ('a','e','i','o','u') with the next vowel in the cyclic sequence a→e→i→o→u→a; consonants remain unchanged. Second, reverse the entire resulting string. Output t. The transformation must be performed in linear time relative to the length of s.

DSA Pattern Breakdown

DSA Pattern Breakdown

"Galactic Translator 2"

medium

WHY DOES IT MATTER?

This pattern is essential because it teaches candidates how to compose simple, constant-time operations into a linear-time algorithm. It highlights the importance of avoiding unnecessary data structure overhead (like regex or dynamic string insertion) and emphasizes the power of direct index manipulation. In interviews, it demonstrates a candidate's ability to think about memory layout and CPU cache efficiency, which are critical for high-performance engineering roles.

OPTIMIZATION CHALLENGE

The key insight is to avoid two separate passes (one for mapping, one for reversing) or using inefficient string concatenation. By iterating from the end of the input to the beginning and applying the mapping on-the-fly, you combine both operations into a single O(n) pass. This reduces the number of memory writes and improves cache locality, as you are accessing the input string in a sequential (though reverse) manner and writing to the output string sequentially.

REAL-WORLD CONNECTION

This is analogous to data serialization and deserialization in microservices. When sending data over the network, you often need to transform the data format (e.g., changing field names, encoding characters) and then reverse the order of fields for a specific protocol. Doing this in a single pass with pre-computed mappings is crucial for minimizing network latency and CPU usage in high-throughput systems like payment gateways or real-time chat applications.

During the interview, explicitly mention that you are using a lookup table for the vowel mapping to ensure O(1) access. Also, clarify that you are building the result string by iterating backwards, which naturally handles the reversal without needing a separate reverse function. This shows you understand the underlying mechanics of string manipulation and are not just relying on library functions blindly.

COMPLEXITY AT A GLANCE

⏱ Time:O(n)
💾 Space:O(n)

Core Theory — Why This Approach?

The problem 'Galactic Translator 2' is a classic example of a linear-time string transformation that combines character mapping with structural manipulation. The core algorithmic theory rests on the principle of single-pass processing. By iterating through the input string exactly once, we can simultaneously determine the transformed character for each position. The key insight is that the 'next vowel' mapping is a constant-time lookup, achievable via a simple array or hash map, ensuring that the character substitution step does not introduce any logarithmic or higher complexity. This transforms a potentially complex state-machine problem into a straightforward O(n) operation.

Naive approaches often fail on large inputs due to unnecessary overhead. For instance, a candidate might attempt to build a new string by repeatedly inserting characters at the beginning to achieve the reversal, which results in O(n^2) time complexity due to the shifting of memory blocks in dynamic arrays. Alternatively, they might use a regex engine to find and replace vowels, which, while O(n) in theory, carries significant constant-factor overhead and memory allocation costs that are prohibitive in high-frequency trading or real-time systems. The optimal paradigm is to decouple the transformation logic from the structural logic: first, map the characters in-place or into a buffer, and then handle the reversal as a distinct, efficient operation.

The optimal solution leverages the fact that reversing a string is a symmetric operation. Instead of physically reversing the array and then mapping, or mapping and then reversing, we can observe that the final character at index i in the result string corresponds to the transformed character at index n-1-i in the original string. This allows for a single-pass construction of the final string by iterating from the end of the input to the beginning, applying the vowel shift, and appending to the result. This approach minimizes memory writes and cache misses, adhering to the cache-friendly access patterns preferred in modern CPU architectures. It demonstrates a deep understanding of how to compose simple O(1) operations into an efficient O(n) algorithm without intermediate data structures.

Interview Questions on This Problem

Q1At a high-frequency trading firm, you need to process a stream of 100 million string tokens per second. How would you optimize the 'Galactic Translator' logic to minimize latency and memory allocation?

I would avoid creating new string objects for each token. Instead, I would use a pre-allocated character buffer and perform the transformation in-place if the string is mutable, or use a fixed-size stack buffer for small strings. For the vowel mapping, I would use a lookup table (array of size 26) instead of a hash map to ensure O(1) access with minimal cache misses. The reversal would be handled by iterating from the end of the buffer to the start, writing directly to the output buffer, thus achieving a single-pass O(n) operation with zero heap allocations.

Q2In a distributed system, how would you handle the case where the input string is too large to fit in memory, requiring a streaming approach for the 'Galactic Translator'?

Since the operation requires reversing the entire string, a simple streaming approach that processes characters left-to-right is not directly possible without buffering. However, if the string is stored in a distributed key-value store, I would fetch the string in chunks. If the total size is known, I can read the chunks in reverse order (from the last byte to the first), apply the vowel transformation on the fly, and write to the output stream. This reduces the memory footprint to the size of a single chunk plus the output buffer, making it scalable for arbitrarily large strings.

Q3How would you extend the 'Galactic Translator' to support multiple languages with different vowel sets and cyclic sequences, while maintaining O(n) time complexity?

I would design a pluggable transformation interface. Each language would have a pre-computed mapping table (e.g., a 256-byte array for ASCII or a HashMap for Unicode) that maps each character to its transformed counterpart. The core algorithm would remain the same: iterate through the string, look up the character in the language-specific map, and append to the result. The reversal step remains independent of the language. This separation of concerns allows for easy extension to new languages without modifying the core logic, and the lookup remains O(1) regardless of the language complexity.

Examples

Example 1

Input

hello

Output

allih

Explanation: Original: h e l l o → shift vowels: e→i, o→a → "hilla" → reverse: "allih".

Example 2

Input

galaxy

Output

yxeleg

Explanation: Original: g a l a x y → shift vowels: a→e, a→e → "gelexy" → reverse: "yxeleg".

Example 3

Input

ufo

Output

afa

Explanation: Original: u f o → shift vowels: u→a, o→a → "afa" → reverse (same): "afa".

Constraints

  • 1 <= s.length <= 100000
  • s consists only of lowercase English letters
  • Time complexity must be O(|s|)
  • Auxiliary space must be O(1) besides the output string

Optimal Approach & Strategy

The optimal approach is to iterate through the input string from the last character to the first. For each character, check if it is a vowel using a pre-computed lookup table, map it to the next vowel if so, and append it to a result string. This single pass combines the mapping and reversal operations, ensuring O(n) time complexity.

Brute Force Approach

A naive approach would be to first create a new string by iterating through the input and replacing vowels using a regex or a series of if-else statements, and then use a built-in reverse function on the resulting string. This is inefficient because it involves multiple passes and potential memory allocations for intermediate strings.

Verified Code Solutions

JavaScript Solution
Time: O(n)
const fs = require('fs');
const input = fs.readFileSync(0, 'utf8').trim();

function galacticTranslator(s) {
    const map = {a:'e', e:'i', i:'o', o:'u', u:'a'};
    let arr = [];
    for (let ch of s) {
        arr.push(map[ch] || ch);
    }
    return arr.reverse().join('');
}

if (input.length > 0) {
    console.log(galacticTranslator(input));
}

Asked in Top Tech Interviews

Swiggy

Solve in Interative Editor

Ready to test your code? Open our built-in compiler, run custom test suites, and see detailed complexity analysis reports instantly.