Algorithm/LeetCode
[LeetCode] 2390. Removing Stars From a String
Jaime.Lee
2023. 7. 31. 01:12
Problem
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.
Solution
문자열 s가 주어질 때 *와 가장 가까운 왼쪽 문자를 제거하는 작업을 모두 완료했을 때의 문자를 반환하는 문제입니다.
package io.lcalmsky.leetcode.removing_stars_from_a_string;
import java.util.Stack;
public class Solution {
public String removeStars(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '*') {
stack.pop();
continue;
}
stack.push(c);
}
StringBuilder stringBuilder = new StringBuilder();
while (!stack.isEmpty()) {
Character pop = stack.pop();
stringBuilder.append(pop);
}
return stringBuilder.reverse().toString();
}
}
저는 stack을 이용해 문제를 해결했습니다.
stack에 문자를 하나씩 추가하면서 *일 경우에 기존 문자를 스택에서 제거하게되면 기존 문자열 기준 왼쪽 문자가 제거되게 됩니다.
그리고 stack에 남은 문자열은 역순이 되므로 마지막에 reverse를 이용해 뒤집어주었습니다.
Test
package io.lcalmsky.leetcode.removing_stars_from_a_string;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
class SolutionTest {
@Test
void testAll() {
assertAll(
() -> test("leet**cod*e", "lecoe"),
() -> test("erase*****", "")
);
}
private void test(String s, String expected) {
// when
Solution solution = new Solution();
String actual = solution.removeStars(s);
// then
assertEquals(expected, actual);
}
}