Build a version of the Unix tr -s command. Given a list of lines and a string chars, collapse consecutive runs of any character that appears in chars to a single occurrence. Other characters are unchanged. Return the lines joined by newline characters (\n).
Notes: chars is a non-empty ASCII string whose characters are taken literally (no ranges). Only runs of the same character from chars are collapsed; all other characters, and runs of characters not in chars, stay as they are. Upper and lower case are different characters. Lines may be empty.
Function signature:
fun trSqueeze(lines: List<String>, chars: String): String
Example:
Input: lines = ["aaabbb", "abaa"], chars = "a" Output: "abbb\naba" When printed: abbb aba
Turn
chars into a HashSet with chars.toHashSet(). Walk each line tracking prev (the last char you kept); skip the current char only if it's in the set AND equals prev.
The full solution:
class Solution {
fun trSqueeze(lines: List<String>, chars: String): String {
val squeeze = chars.toHashSet()
val result = mutableListOf<String>()
for (line in lines) {
val sb = StringBuilder()
var prev = '\u0000'
for (ch in line) {
if (squeeze.contains(ch) && ch == prev) {
continue
}
sb.append(ch)
prev = ch
}
result.add(sb.toString())
}
return result.joinToString("\n")
}
}
Free plan: 30 tutor messages. Premium is unlimited.
