Start learning free

LESSON 195 OF 410 · STRINGS

Reverse String III in Java with O(n) Time Complexity

Practice O(n) Read the full explanation

Given a string, write a function that reverses that string without using built-in functions or libraries.

Example:

Input:  "hello"

Output: "olleh"

Note:

Your algorithm should run in O(n) time and use O(n) extra space.


STEP 1 OF 4
    Ctrl + Enter to check

    JAVA · STRINGS

    Reverse String in Java, explained

    Problem Definition

    The task is to reverse a given string without using any built-in functions or libraries. The input is a single string, and the output should be the reversed version of that string.

    Input:

    A single string s.

    Output:

    A single string which is the reverse of s.

    Constraints:

    • The algorithm should run in O(n) time complexity.
    • The algorithm should use O(n) extra space.

    Example:

    Input: "hello"
    Output: "olleh"

    Understanding the Problem

    The core challenge is to reverse the string efficiently without using built-in functions. This problem is significant as it tests understanding of string manipulation and memory usage. Common applications include data processing and manipulation tasks.

    Potential pitfalls include misunderstanding the constraints and attempting to use built-in functions which are not allowed.

    Approach

    To solve this problem, we need to think about how to reverse a string manually. A naive solution might involve iterating through the string and constructing the reversed string character by character. However, this approach might not be optimal in terms of space and time complexity.

    Naive Solution

    A naive solution would involve creating a new string and appending characters from the original string in reverse order. This approach is straightforward but not optimal as it involves multiple string concatenations which can be inefficient.

    Optimized Solution

    An optimized solution involves using a character array to store the reversed string. This approach ensures that we only traverse the string once, achieving O(n) time complexity. Additionally, using a character array ensures that we use O(n) extra space efficiently.

    Algorithm

    Here is a step-by-step breakdown of the optimized algorithm:

    1. Create a character array of the same length as the input string.
    2. Iterate through the input string from the end to the beginning.
    3. For each character in the input string, place it in the corresponding position in the character array.
    4. Convert the character array back to a string and return it.

    Code Implementation

    public class ReverseString {
        public static String reverse(String s) {
            // Create a character array to hold the reversed string
            char[] reversed = new char[s.length()];
            
            // Iterate through the input string from end to beginning
            for (int i = 0; i < s.length(); i++) {
                // Place characters in the reversed array
                reversed[i] = s.charAt(s.length() - 1 - i);
            }
            
            // Convert the character array back to a string
            return new String(reversed);
        }
    
        public static void main(String[] args) {
            // Test the reverse function
            String input = "hello";
            String output = reverse(input);
            System.out.println("Reversed string: " + output); // Output: "olleh"
        }
    }
    

    Complexity Analysis

    The time complexity of this approach is O(n) because we traverse the input string once. The space complexity is also O(n) because we use a character array of the same length as the input string.

    Edge Cases

    Potential edge cases include:

    • An empty string: The output should also be an empty string.
    • A single character string: The output should be the same as the input.
    • Strings with special characters or spaces: These should be handled correctly and reversed as well.

    Examples:

    Input: ""
    Output: ""
    
    Input: "a"
    Output: "a"
    
    Input: "a b c"
    Output: "c b a"

    Testing

    To test the solution comprehensively, consider a variety of test cases:

    • Simple cases with regular strings.
    • Edge cases with empty strings and single characters.
    • Strings with special characters and spaces.

    Using a testing framework like JUnit can help automate and manage these tests effectively.

    Thinking and Problem-Solving Tips

    When approaching such problems, it is essential to:

    • Understand the problem constraints and requirements thoroughly.
    • Think about different approaches and their trade-offs.
    • Break down the problem into smaller, manageable parts.
    • Practice similar problems to improve problem-solving skills.

    Conclusion

    Reversing a string without using built-in functions is a fundamental problem that helps in understanding string manipulation and memory usage. By practicing such problems, one can improve their problem-solving skills and prepare for more complex challenges.

    Additional Resources

    For further reading and practice, consider the following resources:

    Keep going with JavaAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free