如何从字符串中删除重复的字符

时间:2016-10-13 00:17:51

标签: java string stringbuilder

问题要求我编写一个方法来删除原始字符串中的重复字符并返回新字符串。例如,原始字符串是abracadabra,结果应该是abrcd。

我正在考虑使用StringBuilder来删除字符,但是在我尝试运行代码时出现了问题。任何人都可以帮我解决它。

public static String eliminateDuplicates(String str){
    String result = "";
    StringBuilder strings = new StringBuilder(str);
    for(int i = 0; i<str.length(); i++){
        for(int j = 1; j<str.length();j++){
            if(str.charAt(i)==str.charAt(j)){
                strings.deleteCharAt(j);
            }
        }
    }
    result = strings.toString();
    return result;
}

5 个答案:

答案 0 :(得分:1)

试试这个。

public static String eliminateDuplicates(String str){
    int[] uniq = str.codePoints().distinct().toArray();
    return new String(uniq, 0, uniq.length);
}

答案 1 :(得分:1)

使用@ P.J的想法

public static String eliminateDuplicates(String str) {
    HashSet<Character> hashSet = new HashSet();
    //A hashSet is a collection that only adds unique elements.

    char[] toCharArray = str.toCharArray();
    for (char c : toCharArray) {
        hashSet.add(c);
    }

    StringBuilder answer = new StringBuilder();
    for (Character character : hashSet) {
        answer.append(character);
    }

    return answer.toString();
}

答案 2 :(得分:0)

有问题的代码是迭代输入字符串,但使用索引从字符串构建器对象中删除字符。

每次字符串构建器删除字符时,它的大小都会减小。因此,您的代码将因 IndexOutofBoundsException 而失败。如果是这种情况,请在问题中添加异常的整个堆栈跟踪以进行确认。

删除重复项的更好方法是通过迭代输入字符串然后仅将唯一字符复制到新字符串来创建另一个字符串。然后可以返回新字符串作为结果。

与时间复杂度为O(n*m)

的当前代码相比,O(n*n)的时间复杂度也会更高

答案 3 :(得分:0)

试试这段代码,也许你可以优化:

public static String eliminateDuplicates(String source) {
    StringBuilder result = new StringBuilder();
    for (int i = 0, sLength = source.length(); i < sLength; i++) {
        char readyToAdd = source.charAt(i);
        boolean add = true;

        for (int j = 0; j < result.length(); j++) {
            if (readyToAdd == result.charAt(j)) {
                add = false;
                break;
            }
        }

        if (add) result.append(readyToAdd);
    }

    return result.toString();
}

答案 4 :(得分:0)

试试这个

public static String eliminateDuplicates(String str){
    StringBuilder result = new StringBuilder();
    BitSet bs=new BitSet(256);
    char[] chars=str.toCharArray();
    char getChar=0;
    for(int i=0;i<chars.length;i++){
        getChar=chars[i];
        if(!bs.get(getChar)){
            result.append(getChar);
            bs.set(getChar);
        }
    }
    return result.toString();
}