Medium
You are given a string s.
Consider performing the following operation until s becomes empty:
'a' to 'z', remove the first occurrence of that character in s (if it exists).For example, let initially s = "aabcbbca". We do the following operations:
s = "**a**a**bc**bbca". The resulting string is s = "abbca".s = "**ab**b**c**a". The resulting string is s = "ba".s = "**ba**". The resulting string is s = "".Return the value of the string s right before applying the last operation. In the example above, answer is "ba".
Example 1:
Input: s = “aabcbbca”
Output: “ba”
Explanation: Explained in the statement.
Example 2:
Input: s = “abcd”
Output: “abcd”
Explanation: We do the following operation:
The string just before the last operation is “abcd”.
Constraints:
1 <= s.length <= 5 * 105s consists only of lowercase English letters.import kotlin.math.max
class Solution {
fun lastNonEmptyString(s: String): String {
val freq = IntArray(26)
val ar = s.toCharArray()
val n = ar.size
var max = 1
val sb = StringBuilder()
for (c in ar) {
freq[c.code - 'a'.code]++
max = max(freq[c.code - 'a'.code], max)
}
for (i in n - 1 downTo 0) {
if (freq[ar[i].code - 'a'.code] == max) {
sb.append(ar[i])
freq[ar[i].code - 'a'.code] = 0
}
}
return sb.reverse().toString()
}
}