Удаление дубликатов из строки в Java - PullRequest
15 голосов
/ 14 февраля 2011

Я пытаюсь перебрать строку, чтобы удалить дублирующиеся символы.

Например, строка aabbccdef должна стать abcdef и строка abcdabcd должна стать abcd

Вот что у меня есть:

public class test {

    public static void main(String[] args) {

        String input = new String("abbc");
        String output = new String();

        for (int i = 0; i < input.length(); i++) {
            for (int j = 0; j < output.length(); j++) {
                if (input.charAt(i) != output.charAt(j)) {
                    output = output + input.charAt(i);
                }
            }
        }

        System.out.println(output);

    }

}

Каков наилучший способ сделать это?

Ответы [ 39 ]

0 голосов
/ 24 августа 2017

Это улучшение решения, предложенного @Dave.Здесь я реализую только в одном цикле.

Давайте повторно используем метод return из set.add (T item) и добавляем его одновременно в StringBuffer, если добавление успешно

Это просто O (n).Нет необходимости повторять цикл.

String string = "aabbccdefatafaz";

char[] chars = string.toCharArray();
StringBuilder sb = new StringBuilder();
Set<Character> charSet = new LinkedHashSet<Character>();
for (char c : chars) {
    if(charSet.add(c) ){
        sb.append(c);
    }

}
System.out.println(sb.toString()); // abcdeftz
0 голосов
/ 16 октября 2017

Простое решение состоит в том, чтобы перебрать данную строку и поместить каждый уникальный символ в другую строку (в данном случае, переменную результат ), если эта строка не содержит этот конкретный символ. * результат строка в качестве вывода.

Ниже приведен рабочий и проверенный фрагмент кода для удаления повторяющихся символов из заданной строки, которая имеет O (n) временную сложность.

private static String removeDuplicate(String s) {
      String result="";
      for (int i=0 ;i<s.length();i++) {
          char ch = s.charAt(i);
          if (!result.contains(""+ch)) {
              result+=""+ch;
          }
      }
      return result;
  }

Если ввод мадам , то вывод будет mad .
Если вход анаграмма , тогда вывод будет ангр

Надеюсь, это поможет.
Спасибо

0 голосов
/ 19 апреля 2018

Надеюсь, это поможет.

public void RemoveDuplicates() {
    String s = "Hello World!";
    int l = s.length();
    char ch;
    String result = "";
    for (int i = 0; i < l; i++) {
        ch = s.charAt(i);
        if (ch != ' ') {
            result = result + ch;
        }
        // Replacing space in all occurrence of the current character
        s = s.replace(ch, ' ');
    }
    System.out.println("After removing duplicate characters : " + result);
}
0 голосов
/ 18 марта 2016

Это другой подход

void remove_duplicate (char* str, int len) {
    unsigned int index = 0;
    int c = 0;
    int i = 0;
    while (c < len) {
        /* this is just example more check can be added for
           capital letter, space and special chars */

        int pos = str[c] - 'a';
        if ((index & (1<<pos)) == 0) {
            str[i++] = str[c];
            index |= (1<<pos);
        }
        c++;
    }
    str[i] = 0;
}
0 голосов
/ 18 июля 2018
StringBuilder builderWord = new StringBuilder(word);
 for(int index=0; index < builderWord.length(); index++) {
   for(int reverseIndex=builderWord.length()-1; reverseIndex > index;reverseIndex--) {
     if (builderWord.charAt(reverseIndex) == builderWord.charAt(index)) {
       builderWord.deleteCharAt(reverseIndex);
     }
   }
}
return builderWord.toString();
0 голосов
/ 14 января 2018
package com.st.removeduplicate;
 public class RemoveDuplicate {
   public static void main(String[] args) {
    String str1="shushil",str2="";      
    for(int i=0; i<=str1.length()-1;i++) {
        int count=0;
        for(int j=0;j<=i;j++) {
            if(str1.charAt(i)==str1.charAt(j)) 
                count++;
            if(count >1)
                break;
        }
        if(count==1) 
            str2=str2+str1.charAt(i);
    }
    System.out.println(str2);

}

}

0 голосов
/ 23 июля 2016

Другое возможное решение, если строка является строкой ASCII, состоит в том, чтобы поддерживать массив из 256 логических элементов для обозначения появления символа ASCII в строке. Если персонаж появился впервые, мы сохраняем его и добавляем к результату. В противном случае просто пропустите это.

public String removeDuplicates(String input) {
    boolean[] chars = new boolean[256];
    StringBuilder resultStringBuilder = new StringBuilder();
    for (Character c : input.toCharArray()) {
        if (!chars[c]) {
            resultStringBuilder.append(c);
            chars[c] = true;
        }
    }
    return resultStringBuilder.toString();
}

Этот подход также будет работать со строкой Unicode. Вам просто нужно увеличить chars размер.

0 голосов
/ 11 апреля 2018

пакет com.core.interview.client;

импорт java.util.LinkedHashSet;

импорт java.util.Scanner;

импорт java.util.Set;

открытый класс RemoveDuplicateFromString {

public static String DupRemoveFromString(String str){




    char[] c1 =str.toCharArray();

    Set<Character> charSet = new LinkedHashSet<Character>();

     for(char c:c1){

        charSet.add(c);
    }

     StringBuffer sb = new StringBuffer();


      for (Character c2 : charSet) {


          sb.append(c2);
    }   

    return sb.toString();

}

public static void main(String[] args) {


    System.out.println("Enter Your String: ");


    Scanner sc = new Scanner(System.in);


    String str = sc.nextLine();


    System.out.println(DupRemoveFromString(str));
}

}

0 голосов
/ 24 июля 2016

Решение с использованием JDK7:

public static String removeDuplicateChars(final String str){

    if (str == null || str.isEmpty()){
        return str;
    }

    final char[] chArray = str.toCharArray();
    final Set<Character> set = new LinkedHashSet<>();
    for (char c : chArray) {
        set.add(c);
    }

    final StringBuilder sb = new StringBuilder();
    for (Character character : set) {
        sb.append(character);
    }
    return sb.toString();
}
0 голосов
/ 16 июня 2018

есть массив, чтобы узнать, записан ли уже символ или нет; если нет, добавьте это в строковый буфер. Обратите внимание, что я сделал это с учетом регистра; с массивом int вы всегда можете сделать это (в этом коде этого не сделано), чтобы также возвращать количество вхождений.

private static String removeDuplicates(String s) {

    int [] occurrences = new int[52];
    Arrays.fill(occurrences,0);

    StringBuffer deDupS = new StringBuffer();
    for(int i = 0; i < s.length(); i++) {
        if(s.charAt(i) >= 97) {
            if(occurrences[s.charAt(i) - 97] == 0) {
                deDupS.append(s.charAt(i));
                occurrences[s.charAt(i) - 97]++;
            }
        } else if(s.charAt(i) >= 65) {
            if(occurrences[s.charAt(i) - 65 + 26] == 0) {
                deDupS.append(s.charAt(i));
                occurrences[s.charAt(i) - 65 + 26]++;
            }
        }
    }

    return deDupS.toString();

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...