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:
func trSqueeze(_ lines: [String], _ chars: String) -> String
Example:
Input: lines = ["aaabbb", "abaa"], chars = "a" Output: "abbb\naba" When printed: abbb aba
Put each char of
chars into a Set<Character>. 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 {
func trSqueeze(_ lines: [String], _ chars: String) -> String {
var squeeze = Set<Character>()
for ch in chars {
squeeze.insert(ch)
}
var result = [String]()
for line in lines {
var sb = ""
var prev: Character = "\0"
for ch in line {
if squeeze.contains(ch) && ch == prev {
continue
}
sb.append(ch)
prev = ch
}
result.append(sb)
}
return result.joined(separator: "\n")
}
}
Free plan: 30 tutor messages. Premium is unlimited.
