删除重复项而不使用其他缓冲区

时间:2013-04-02 16:06:51

标签: java duplicate-removal

我编写了一个简单的程序,可以在不使用任何其他缓冲区的情况下从String中删除重复项。如果这是一个很好的解决方案,有人可以告诉我吗?我只是想知道是否有比下面的解决方案更好的其他解决方案..

编辑: 如果我传入'Follow Up'作为输入,我应该回到唯一的字符串'FW UP'

    public static void removeDuplicateString(String input) {
        String value1 = input;
        String value2 = input;
        String finalValue = "";
        int count = 0;
        char char1;
        char char2;
        for (int i = 0; i < value1.length(); i++) {
            char1 = value1.charAt(i);
            for (int j = 0; j < value2.length(); j++) {
                char2 = value2.charAt(j);
                if (char1 == char2) {
                    count++;
                }
            }
            if (count > 1) {
                //System.out.println(i);
            } else {
                finalValue = finalValue + char1;
            }

            count = 0;
        }
        System.out.println(finalValue);
    }

}

5 个答案:

答案 0 :(得分:2)

如何使用这样的正向前导这样的正则表达式从给定的字符串中删除重复的字符:

String nonDup = input.replaceAll("(.)(?=.*?\\1)", "");

现场演示:http://ideone.com/W7EaPq

答案 1 :(得分:0)

你可以试试这个:

public String removeDuplicateChars(String inputString) {
        if (inputString.length() <= 1 ) {
            return inputString;
        }
        if(inputString.substring(1, 2).equals(inputString.substring(0, 1)) ) {
            return removeDuplicateChars(inputString.substring(1));
        } else {
            return inputString.substring(0, 1) + removeDuplicateChars(inputString.substring(1));
        }
    }

答案 2 :(得分:0)

公共你可以试试这个:

   public static void removeDuplicateString(String input) {
        char[] ch = input.toCharArray();
        char[] copy = new char[ch.length];
        char[] avoid = new char[ch.length];
        int counter = 0,count=0;
        for (int i = 0 ; i < ch.length; i++)
        {
            char cch = ch[i];
            boolean duplicate = false;
            if (input.indexOf(cch)==i && input.indexOf(cch,i+1)==-1)
            {
                for (int j = 0 ; j <=count ; j++)
                {
                    if (avoid[i]==cch)
                    {
                        duplicate = true;
                        break;
                    }
                }
                if (!duplicate)
                {
                    copy[counter] = cch;
                    counter++;
                }
            }
            else
            {
                avoid[count] = cch;
                count++;
            }
        }
        String finalString = new String(copy,0,counter);
        System.out.println(finalString);
    }

答案 3 :(得分:0)

您的解决方案有效。

另一种解决方案:

public static void removeDuplicateString2(String input) {
    wh:
    while(true)
    {
        for(char c : input.toCharArray())
        {
            if(input.contains("" + c + c))
            {
                input = input.replaceAll("["+ c +"]" + "["+ c +"]", "");
                continue wh;
            }
        }
        break;
    }

    System.out.println(input);
}

丑陋但有效。

答案 4 :(得分:0)

您可以使用“Mergesort”或“Quicksort”(假设您可以在排序时使用临时arry来分配数据,您需要额外的“O(n)”空间来执行此操作)。 / p>

一旦你对数组进行了排序,你可以简单地遍历数组,将一个元素与下面的元素进行比较,每当你发现一个给定的元素等于同一个元素时,你将元素移回一个位置。

通过这样做你有:

  • O(N LOG N)因为排序
  • O(N)迭代所有元素
  • O(M)向后移动元素

根据重复数量的不同,此代码可能会变得非常慢,因为向后移动元素以删除重复项的成本。