2016-04-24 3 views
3

Я начал читать знаменитую книгу «Взламывание книги по кодированию».Удалите повторяющиеся символы в строке в Java

Разработать алгоритм и написать код для удаления дубликатов символов в строке без использования дополнительного буфера. ПРИМЕЧАНИЕ. Одна или две дополнительные переменные являются точными. Дополнительной копией массива нет.

я нашел подобную тему здесь: Remove the duplicate characters in a string

Решение дано автором было то, что:

public static void removeDuplicates(char[] str) { 
    if (str == null) return; 
    int len = str.length; 
    if (len < 2) return; 

    int tail = 1; 

    for (int i = 1; i < len; ++i) { 
     int j; 

     for (j = 0; j < tail; ++j) { 
     if (str[i] == str[j]) break; 
     } 

     if (j == tail) { 
     str[tail] = str[i]; 
     ++tail; 
    } 
    } 
    str[tail] = 0; 
} 

Проблема здесь состоит в том, что автор использовал массив быть аргументом в пользу этого функция. Поэтому мой вопрос: как вы можете написать алгоритмы с STRING в качестве аргумента? Потому что я чувствовал, что здесь очень просто использовать массив, и это похоже на то, что вы «избегаете трудностей» упражнений (на мой взгляд, я новый разработчик Java).

Как вы можете написать такой алгоритм?

+0

Ради Вопрос, давайте предположим, строки были изменяемыми, что вы можете удалить символы из них: Вы можете использовать String.charAt (положение), чтобы получить символ на этой позиции так же, как вы используете массив [должность]. – Vucko

ответ

3

Строки Java неизменяемы, поэтому вы не можете сделать это со строкой без копирования массива в буфер.

+0

Добавление к этому ... 'str [tail] = str [i]' - это оператор, для которого требуется массив. –

0

для этого, чтобы работать с String, вам нужно вернуть String из метода, который представляет измененную строку без дубликатов. не знаю, будет ли это противоречить правилам, но вот как бы я решил проблему с String's:

для каждого символа в строке, я бы разделил строку на этот символ. я удалю все экземпляры этого символа из последней подстроки. я бы затем соединил бывшую подстроку с модифицированной последней подстрокой, убедившись, что персонаж все еще хранится на своем месте. что-то вроде этого:

public static String removeDuplicates(String str) { 
    if(str == null || str.length() < 2) 
     return str; 
    String temp; 
    for(int x = 0; x + 1 < str.length(); x++) { 
     temp = str.charAt(x) + ""; 
     str = str.substring(0, x) + temp + str.substring(x + 1).replaceAll(temp, ""); 
    } 
    return str; 
} 
Смежные вопросы