Skip to main content

Removing Stars From a String - Solution & Explanation

MediumStringStackSimulation15 min readAsked at: Amazon, Microsoft, IBM +1
Practice this problem

Problem Statement

You are given a string s, which contains stars *.

In one operation, you can:

  • Choose a star in s.
  • Remove the closest non-star character to its left, as well as remove the star itself.

Return the string after all stars have been removed.

Note:

  • The input will be generated such that the operation is always possible.
  • It can be shown that the resulting string will always be unique.

 

Example 1:

Input: s = "leet**cod*e"
Output: "lecoe"
Explanation: Performing the removals from left to right:
- The closest character to the 1st star is 't' in "leet**cod*e". s becomes "lee*cod*e".
- The closest character to the 2nd star is 'e' in "lee*cod*e". s becomes "lecod*e".
- The closest character to the 3rd star is 'd' in "lecod*e". s becomes "lecoe".
There are no more stars, so we return "lecoe".

Example 2:

Input: s = "erase*****"
Output: ""
Explanation: The entire string is removed, so we return an empty string.

 

Constraints:

  • 1 <= s.length <= 105
  • s consists of lowercase English letters and stars *.
  • The operation above can be performed on s.

Approach Overview

Problem Overview: You are given a string where the character * represents a deletion operation. Each star removes the closest non-deleted character to its left along with the star itself. After processing the entire string, return the final string that remains.

This problem is essentially a simulation of deletions while scanning the string. The key challenge is efficiently identifying and removing the most recent valid character when a star appears. Because deletions always target the closest character to the left, the problem naturally maps to a Last-In-First-Out structure.

Approach 1: Stack-based Simulation (O(n) time, O(n) space)

The most direct solution uses a stack to simulate the removal process. Iterate through the string character by character. When you see a regular character, push it onto the stack. When you encounter *, pop the top character from the stack because that represents the closest undeleted character to the left. This works because the most recently added character is exactly the one that should be removed.

After processing all characters, the stack contains the remaining characters in order. Convert the stack back into a string to produce the result. Each character is pushed and popped at most once, so the total time complexity is O(n). The stack can grow up to the length of the string, giving O(n) space complexity. This approach is intuitive and commonly used for problems involving undo-like operations or nested processing in string manipulation.

Approach 2: Two-pointer Technique (O(n) time, O(n) space)

A more space-efficient simulation can be built using the two-pointer technique and processing the string from right to left. The key observation: when you see a star, it will delete one valid character to its left. Instead of immediately removing characters, track how many characters should be skipped.

Traverse the string from the end while maintaining a counter of pending deletions. When you see *, increment the counter. When you see a normal character and the counter is greater than zero, skip the character and decrement the counter because it gets removed by a star. If the counter is zero, keep the character. Append kept characters to a result buffer and reverse it at the end.

This approach still runs in O(n) time because each character is processed once. The extra space for the output string is O(n). It avoids the explicit stack structure and instead relies on pointer traversal and deletion counting, which can feel cleaner in languages where stack operations add overhead.

Recommended for interviews: The stack-based approach is the one most interviewers expect because the deletion rule directly matches stack behavior. Implementing it quickly shows strong intuition for LIFO problems and string simulation. The two-pointer version demonstrates deeper insight into optimizing simulations by reversing traversal and tracking pending operations.

Approach 1: Stack-based Approach

This approach utilizes a stack data structure to handle the character removals efficiently. As we iterate through the string, whenever a star (*) is encountered, we pop from the stack, effectively removing the last non-star character added. This allows us to handle both the star and its preceding non-star character in O(1) time.

The C implementation uses a character array as a stack to store non-star characters. We increment the top index when adding a character and decrement it when encountering a star, which effectively removes the most recent non-star character.

Code

C

C++

Java

Python

C#

JavaScript

Complexity

Time Complexity: O(n), where n is the length of the string.
Space Complexity: O(n), for the stack to hold characters.

Try this approach in the editor →

Approach 2: Two-pointer Technique

This alternative method involves using a simple two-pointer technique where we iterate through the string and build the result in place. We treat the string as a writable array and maintain a 'write' index that tells us where to place the next character. When we encounter a star, we just need to move the 'write' index back to overwrite the previous character.

This C implementation makes use of two indices: read, which traverses the string, and write, which indicates where to write the next character.

Code

C

C++

Java

Python

C#

JavaScript

Complexity

Time Complexity: O(n)
Space Complexity: O(1), since operations are done in-place.

Try this approach in the editor →

Approach 3: Stack Simulation

We can use a stack to simulate the operation process. Traverse the string s, and if the current character is not an asterisk, push it onto the stack; if the current character is an asterisk, pop the top element from the stack.

Finally, concatenate the elements in the stack into a string and return it.

The time complexity is O(n), where n is the length of the string s. Ignoring the space consumption of the answer string, the space complexity is O(1).

Code

Python

Java

C++

Go

TypeScript

Rust

PHP

Try this approach in the editor →

Complexity Comparison

ApproachComplexity
Stack-based Approach

Time Complexity: O(n), where n is the length of the string.
Space Complexity: O(n), for the stack to hold characters.

Two-pointer Technique

Time Complexity: O(n)
Space Complexity: O(1), since operations are done in-place.

Stack Simulation—

Detailed Complexity Analysis

ApproachTimeSpaceWhen to Use
Stack-based SimulationO(n)O(n)Best general solution. Clear mapping between '*' and stack pop operations.
Two-pointer Technique (right-to-left)O(n)O(n)Useful when simulating deletions by counting operations instead of storing a stack.

Video Solution

Removing Stars From a String - Leetcode 2390 - Python • NeetCodeIO • 50,425 views views

Watch 9 more video solutions →

Frequently Asked Questions

Is Removing Stars From a String easy or hard?
The problem is rated Medium on LeetCode but is often considered an easier medium question. The logic becomes straightforward once you recognize the stack pattern where '*' behaves like an undo operation that removes the most recent character.
Removing Stars From a String Python/Java solution
In Python, use a list as a stack and append characters while popping when '*' appears. In Java, use a StringBuilder or a Deque to simulate stack operations. Both implementations achieve O(n) time and O(n) space complexity.
How to solve Removing Stars From a String in O(n)?
Traverse the string once and simulate deletions. Using a stack, push normal characters and pop when encountering '*'. Another O(n) method scans from right to left using a counter that tracks how many characters should be skipped due to stars.
What is the best approach for Removing Stars From a String?
The stack-based approach is the most common and intuitive solution. Iterate through the string, push characters onto a stack, and pop the top element whenever a '*' appears. This directly simulates removing the closest character to the left and runs in O(n) time with O(n) space.
Is Removing Stars From a String asked at Google/Amazon/Meta?
Problems involving stack-based string processing and simulation are common in interviews at companies like Amazon, Google, and Meta. Variations of this problem appear in interview practice sets because they test understanding of stacks, string traversal, and efficient simulation.
What data structure is used in Removing Stars From a String?
A stack is the primary data structure used to solve the problem efficiently. The stack stores characters as they appear, and when a '*' is encountered the most recent character is removed using a pop operation. This matches the problem's requirement of deleting the closest character to the left.
What is the time complexity of Removing Stars From a String?
The optimal solutions run in O(n) time where n is the length of the string. Each character is processed once, and stack operations such as push and pop are O(1). The overall space complexity is O(n) because the result or stack can store up to n characters.

Ready to solve this problem?

Practice Removing Stars From a String with our built-in code editor and test cases.

Practice on FleetCode