Problem Statement
leetcode problem link
My Solution [Accepted]
public class Solution {
public string RemoveStars(string s) {
Stack<Char> stack = new Stack<Char>();
foreach (var c in s) {
if (c == '*' && stack.Count > 0) {
stack.Pop();
}
else {
stack.Push(c);
}
}
return string.Join("", stack.Reverse());
}
}
Improve Code
public class Solution
{
public string RemoveStars(string s)
{
var stack = new Stack<char>();
foreach (char c in s)
{
if (c == '*')
{
if (stack.Count > 0)
stack.Pop();
}
else
{
stack.Push(c);
}
}
// stack is reversed, so build string in correct order
var sb = new StringBuilder(stack.Count);
foreach (char c in stack.Reverse())
sb.Append(c);
return sb.ToString();
}
}
Editorial
Approach 1: Stack
class Solution:
def removeStars(self, s):
st = []
for i in range(0, len(s)):
if s[i] == '*':
st.pop()
else:
st.append(s[i])
return ''.join(st)
Approach 2: Strings
class Solution {
public:
string removeStars(string s) {
string answer = "";
for (int i = 0; i < s.size(); i++) {
if (s[i] == '*') {
answer.pop_back();
} else {
answer.push_back(s[i]);
}
}
return answer;
}
};
Approach 3: Two Pointers
class Solution {
public:
string removeStars(string s) {
vector<char> ch(s.size());
int j = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '*') {
j--;
} else {
ch[j++] = s[i];
}
}
string answer = "";
for (int i = 0; i < j; i++) {
answer.push_back(ch[i]);
}
return answer;
}
};