在Java中删除字符串中的重复字符

3
我开始阅读著名的“破解编程面试”书籍。
设计一个算法并编写代码,在不使用任何附加缓冲区的情况下删除字符串中的重复字符。注意:使用一两个额外变量是可以的,但不能使用数组的额外副本。
我在这里找到了一个类似的主题: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;
 }

这里的问题在于作者使用了一个数组作为此函数的参数。所以我的问题是:你如何使用字符串作为参数编写算法?因为我感觉在这里使用数组更容易,并且这样你可以“避开”练习中的困难(在我看来,我是一个新手Java开发者)。
你如何编写这样的算法?

为了问题的简化,假设字符串是可变的,也就是说你可以从中删除字符:你可以使用String.charAt(position)来获取该位置上的字符,就像使用array[position]一样。 - Vucko
3个回答

3

Java字符串是不可变的,因此如果不将数组复制到缓冲区中,则无法对其进行更改。


除此之外,str[tail] = str[i]是需要一个数组的语句。 - Em Ae

0
为了使这个方法适用于一个字符串,你需要从表示修改后的字符串中返回一个字符串。不确定是否违反规则,但是我会这样解决使用字符串的问题:
对于字符串中的每个字符,我会在该字符处将字符串分割。然后,我会从后面的子字符串中删除所有该字符的实例。然后,我会将前面的子字符串与修改后的后面的子字符串连接起来,确保字符仍然保持在原位。就像这样:
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;
}

0
在Java 8中,我们可以这样做。
private void removeduplicatecharactersfromstring() {
    String myString = "aabcd eeffff ghjkjkl";
    StringBuilder builder = new StringBuilder();
    System.out.println(myString);
    Arrays.asList(myString.split(" "))
            .forEach(s -> {
                builder.append(Stream.of(s.split(""))
                        .distinct().collect(Collectors.joining()).concat(" "));
            });
    System.out.println(builder); // abcd ef ghjkl
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接