Description
You are given a string s
consisting of lowercase English letters and the special characters: '*'
, '#'
, and '%'
.
You are also given an integer k
.
Build a new string result
by processing s
according to the following rules from left to right:
- If the letter is a lowercase English letter append it to
result
. - A
'*'
removes the last character fromresult
, if it exists. - A
'#'
duplicates the currentresult
and appends it to itself. - A
'%'
reverses the currentresult
.
Return the kth
character of the final string result
. If k
is out of the bounds of result
, return '.'
.
Β
Example 1:
Input: s = "a#b%*", k = 1
Output: "a"
Explanation:
i | s[i] | Operation | Current result |
---|---|---|---|
0 | 'a' | Append 'a' | "a" |
1 | '#' | Duplicate result | "aa" |
2 | 'b' | Append 'b' | "aab" |
3 | '%' | Reverse result | "baa" |
4 | '*' | Remove the last character | "ba" |
The final result
is "ba"
. The character at index k = 1
is 'a'
.
Example 2:
Input: s = "cd%#*#", k = 3
Output: "d"
Explanation:
i | s[i] | Operation | Current result |
---|---|---|---|
0 | 'c' | Append 'c' | "c" |
1 | 'd' | Append 'd' | "cd" |
2 | '%' | Reverse result | "dc" |
3 | '#' | Duplicate result | "dcdc" |
4 | '*' | Remove the last character | "dcd" |
5 | '#' | Duplicate result | "dcddcd" |
The final result
is "dcddcd"
. The character at index k = 3
is 'd'
.
Example 3:
Input: s = "z*#", k = 0
Output: "."
Explanation:
i | s[i] | Operation | Current result |
---|---|---|---|
0 | 'z' | Append 'z' | "z" |
1 | '*' | Remove the last character | "" |
2 | '#' | Duplicate the string | "" |
The final result
is ""
. Since index k = 0
is out of bounds, the output is '.'
.
Β
Constraints:
1 <= s.length <= 105
s
consists of only lowercase English letters and special characters'*'
,'#'
, and'%'
.0 <= k <= 1015
- The length of
result
after processings
will not exceed1015
.
Solution
Python3
class Solution:
def processStr(self, s: str, k: int) -> str:
l = 0
for x in s:
if x == "*":
if l > 0:
l -= 1
elif x == "#":
l *= 2
elif x == "%":
continue
else:
l += 1
if k >= l: return '.'
for x in s[::-1]:
if x == "*":
l += 1
elif x == '#':
l //= 2
if k >= l:
k -= l
elif x == "%":
k = l - 1 - k
else:
l -= 1
if l == k:
return x