Выявить повторяющиеся символы в строке и заменить их


Нашел в JavaScript задание Codewars.com:

Цель этого упражнения состоит в том, чтобы преобразовать строку в новую строку, где каждый символ в новой строке '(' если этот символ появляется только как только в исходной строке, или ')' если этот символ появляется более не раз в исходной строке. Игнорировать регистр, когда определения если персонаж является дубликатом.

Примеры:

"din" => "((("
"recede" => "()()()"
"Success" => ")())())"
"(( @" => "))(("

Я сделал задание в Java, и придумал ниже код. Я хочу знать, является ли это написать так, чтобы код или есть ли лучший способ? Если так, пожалуйста, дайте мне знать.

private static String duplicateEncode(String word) {
    String encodeString = "";
    String decodedString = word.toLowerCase();
    for (int i = 0; i < decodedString.length(); i++) {

        if (decodedString.substring(i + 1, decodedString.length())
                .contains(String.valueOf(decodedString.charAt(i)))
                || decodedString.substring(0, i).contains(String.valueOf(decodedString.charAt(i)))) {
            encodeString += ")";
        } else {
            encodeString += "(";
        }

    }
    return encodeString;
}


Комментарии
1 ответ

Вот лучшее решение, используя хэш-карте:

 public static String encode(String input) {
final StringBuilder builder = new StringBuilder();
final Map<Character, Integer> indexMap = new HashMap<>();
for (int index = 0; index < input.length(); index++) {
char ch = Character.toLowerCase(input.charAt(index));
if(indexMap.containsKey(ch)) {
int previous = indexMap.get(ch);
builder.replace(previous, previous+1, ")");
builder.append(')');
}else {
indexMap.put(ch, index);
builder.append('(');
}
}
return builder.toString();
}

Это требует время o(n) времени и о(n) дополнительное пространство, но это намного быстрее, чем ваша. Кроме того, попробуйте использовать StringBuilder Если вы добавляете строки в цикле.

-1
ответ дан 13 марта 2018 в 04:03 Источник Поделиться