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:
public String trSqueeze(List<String> lines, String chars)
Example:
Input: lines = ["aaabbb", "abaa"], chars = "a" Output: "abbb\naba" When printed: abbb aba
Put each char of
chars into a HashSet<Character>. Walk each line tracking char prev = '\0'; skip the current char only if it's in the set AND equals prev.
The full solution:
class Solution {
public String trSqueeze(List<String> lines, String chars) {
Set<Character> squeeze = new HashSet<>();
for (int i = 0; i < chars.length(); i++) {
squeeze.add(chars.charAt(i));
}
List<String> result = new ArrayList<>();
for (String line : lines) {
StringBuilder sb = new StringBuilder();
char prev = '\0';
for (int j = 0; j < line.length(); j++) {
char ch = line.charAt(j);
if (squeeze.contains(ch) && ch == prev) {
continue;
}
sb.append(ch);
prev = ch;
}
result.add(sb.toString());
}
return String.join("\n", result);
}
}
Free plan: 30 tutor messages. Premium is unlimited.
