Символы данной строки должны быть отсортированы в соответствии с порядком, определенным другой строкой образца. Требования к сложности O (n + m) , где n
- длина строки, а m
- длина шаблона.
Пример:
Шаблон: 1234567890AaBbCcDdEeFfGgHh
Строка: dH7ee2D6a341Fb9Ea20dhC1g7ca32Ba2Gac5f76A2g
Результат: 112222233456677790AaaaaaBbCccDddEeeFfGggHh
В шаблоне есть все символы строки, и каждый из них появляется в шаблоне только один раз.
Мой код:
// Instances of possible values for input:
String pattern = "1234567890AaBbCcDdEeFfGgHh";
String string = "dH7ee2D6a341Fb9Ea20dhC1g7ca32Ba2Gac5f76A2g";
// Builder to collect characters for sorted result:
StringBuilder result = new StringBuilder();
// Hash table based on characters from pattern to count occurrence of each character in string:
Map<Character, Integer> characterCount = new LinkedHashMap<>();
for (int i = 0; i < pattern.length(); i++) {
// Put each character from pattern and initialize its counter with initial value of 0:
characterCount.put(pattern.charAt(i), 0);
}
// Traverse string and increment counter at each occurrence of character
for (int i = 0; i < string.length(); i++) {
char ch = string.charAt(i);
Integer count = characterCount.get(ch);
characterCount.put(ch, ++count);
}
// Traverse completed dictionary and collect sequentially all characters collected from string
for (Map.Entry<Character, Integer> entry : characterCount.entrySet()) {
Integer count = entry.getValue();
if (count > 0) {
Character ch = entry.getKey();
// Append each character as many times as it appeared in string
for (int i = 0; i < count; i++) {
result.append(ch);
}
}
}
// Get final result from builder
return result.toString();
Оптимален ли этот код? Есть ли способ улучшить этот алгоритм? Правильно ли я понимаю, что он удовлетворяет заданной сложности O (n + m)?