如何获取由原始字符串保留顺序的所有唯一字符组成的字符串?

时间:2015-07-31 10:32:25

标签: java string

给出一个字符串输入:

aaabbbcccdddeee

输出应为:

abcde

我是如何制作这个节目的?

给定一个输入字符串,我已经使用冒泡排序[不需要现在有效的算法]按升序对此字符串的字符进行排序,然后删除重复项。

但问题是我无法在bbkjhiaa之类的字符串字符串上应用此方法,因为它会更改原始字符串的顺序。

我需要使用数组和字符串的概念来编写代码。

class SingleOccurence
{
    static String singleoccurence(String p)
    {
        char current = ch[0];
        boolean found = false; //what is the use of boolean variable 
        for (int i = 0; i < ch.length; i++) 
        {
            if (current == ch[i] && !found) 
            {
                found = true;  
            }
            else if (current != ch[i])
            {
                System.out.print(current);
                current = ch[i];
                found = false;
            }
        }
        System.out.println(current);
        String s4=new String(ch);
        return s4;   
    }
    public static void main(String s[])
    {  
        String s1=new String("qwwnniitootiinn");
        String s6=SortingDemo.bubble1(s1);
        String s5=singleoccurence(s6);   
    }
}

3 个答案:

答案 0 :(得分:1)

确实排序字符串是不可能的,因为这可能会改变输入。

你需要做的是将整个字符串放在一个数组中,然后从头到尾迭代数组。始终记住上次访问的值并与之进行比较。如果我们现在考虑的值与前一个相同,则跳过它,否则显示它。

public static String deDuplicate(char[] inpt) {
    Set<Character> already_seen_chars = new HashSet<Character>();
    String result = "";

    for(int i = 0; i < inpt.length; i++) {
        if(!already_seen_chars.contains(inpt[i])) { // Is the character already contained in the set?
            result += Character.toString(inpt[i]);
            already_seen_chars.add(inpt[i]);
        }
    }

    return result;
}

public static void main(String[] args) {
    String test = "ttttteeeeesssstttt";
    System.out.println(deDuplicate(test.toCharArray()));
}

输入: qwwnniitootiinn ,输出: qwnito

请注意,性能也比以前更好,O(n)而不是O(n ^ 2)(其中n是字符串的长度)。

编辑:如果不允许使用Set数据结构,可以用for循环替换mySet.contains(...),循环遍历字符串并检查字符。

这给出了:

public static String deDuplicate(String input) {
    char[] inpt = input.toCharArray();
    String result = "";

    for(int i = 0; i < inpt.length; i++) {
        if(!contains(inpt, inpt[i], i)) { // Is the character already contained in the set?
            result += Character.toString(inpt[i]);
        }
    }

    return result;
}

contains函数是:

public static boolean contains(char[] inpt, char c, int maxIndex) {
    for(int i = 0; (i < inpt.length) && (i < maxIndex); i++) {
        if(inpt[i] == c)
            return true;
    }

    return false;
}

请注意,这会影响性能! for中的deDuplicate循环现在调用contains,其中还包含for循环。因此导致O(n ^ 2)性能。

答案 1 :(得分:1)

这对你有用:

public static void main(String[] args) {    
    String s = "aaabbbcccdddeee";
    System.out.println(s.replaceAll("(.)(?=.*\\1)",""));
}

O / P:

abcde

输入:bbkjhiaa O / P:bkjhia

答案 2 :(得分:1)

取消重复数据的最简单方法是使用Set,因为sets only allow each object in them to appear once

示例:

String onlyUniqueCharacters(String s) {
    final StringBuilder sb = new StringBuilder();
    final Set<Character> uniqueChars = new HashSet<>();
    for (int i = 0; i < s.length(); i++) {
        final char c = s.charAt(i);
        if (uniqueChars.add(c) sb.append(c);
    }
    return sb.toString();
 }