Process String with Special Operations I

medium string simulation stack

Problem

Scan the string s from left to right, building a string result. A lowercase letter is appended to result. '*' removes the last character of result (if any). '#' duplicates result (appends it to itself). '%' reverses result. Return the final result.

Inputs = "a#b%*"
Output"ba"
a → "a"; # → "aa"; b → "aab"; % → "baa"; * → "ba".

def processStr(s):
    result = []                 # treat as a growable buffer
    for ch in s:
        if ch == '*':           # remove last character
            if result:
                result.pop()
        elif ch == '#':         # duplicate the whole string
            result = result + result
        elif ch == '%':         # reverse in place
            result.reverse()
        else:                   # lowercase letter: append
            result.append(ch)
    return ''.join(result)
function processStr(s) {
  let result = [];                // growable buffer
  for (const ch of s) {
    if (ch === '*') {             // remove last character
      if (result.length) result.pop();
    } else if (ch === '#') {      // duplicate the whole string
      result = result.concat(result);
    } else if (ch === '%') {      // reverse in place
      result.reverse();
    } else {                      // lowercase letter: append
      result.push(ch);
    }
  }
  return result.join('');
}
String processStr(String s) {
    StringBuilder result = new StringBuilder();
    for (char ch : s.toCharArray()) {
        if (ch == '*') {              // remove last character
            int n = result.length();
            if (n > 0) result.deleteCharAt(n - 1);
        } else if (ch == '#') {       // duplicate the whole string
            result.append(result);
        } else if (ch == '%') {       // reverse in place
            result.reverse();
        } else {                      // lowercase letter: append
            result.append(ch);
        }
    }
    return result.toString();
}
string processStr(string s) {
    string result;
    for (char ch : s) {
        if (ch == '*') {              // remove last character
            if (!result.empty()) result.pop_back();
        } else if (ch == '#') {       // duplicate the whole string
            result += result;
        } else if (ch == '%') {       // reverse in place
            reverse(result.begin(), result.end());
        } else {                      // lowercase letter: append
            result += ch;
        }
    }
    return result;
}
Time: O(n · L) Space: O(L)