2016-04-24 151 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一起工作,您必须从代表修改后的str的方法返回String,而且没有重复项。不知道它是否会违反规则,但这里是我如何解决这个问题String的:

对于字符串中的每个字符,我会分割该字符串。我会从后面的子字符串中移除该字符的所有实例。然后我会连接前一个子字符串和修改后的子字符串,确保字符仍然保留在它的位置。是这样的:

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; 
}