从字符串中删除连续重复的字符

3
我正在尝试使用递归从字符串中删除重复字符。 当字符具有不同的大小写时,我不知道如何修改此代码以保留第一个字符。
/**
     * Remove consecutive duplicate characters from a String. <br>
     * Case should not matter, if two or more consecutive duplicate <br>
     * characters have different cases, then the first letter should be kept.
     * @param word A word with possible consecutive duplicate characters.
     * @return A word without any consecutive duplicate characters.
     */

    public static String dedupeChars(String word){

        if ( word.length() <= 1 )
            return word;

       if( word.substring(0,1).equalsIgnoreCase(word.substring(1,2)) )       
            return dedupeChars(word.substring(1));

       else
            return word.substring(0,1) + dedupeChars(word.substring(1));

    }

"我不知道如何修复这段代码" 你试图修复什么? - deadshot
2个回答

4
你的方向是正确的,但逻辑有些偏差。考虑以下带有代码解释的版本:
public static String dedupeChars(String word) {
    if (word.length() <= 1) {
        return word;
    }

    if (word.substring(0,1).equalsIgnoreCase(word.substring(1,2))) {
        return dedupeChars(word.substring(0, 1) + word.substring(2));
    }
    else {
        return word.substring(0,1) + dedupeChars(word.substring(1));
    }
}

System.out.println(dedupeChars("aaaaBbBBBbCDdefghiIIiJ"));

这将输出:

aBCDefghiJ

对于算法的解释,你的基本情况是正确的,对于只有一个字符的单词,我们只返回该字符。对于第一个字符与第二个字符相同的情况,我们删掉第二个字符,然后再次递归调用 dedupeChars()。例如,以下是上面所示输入字符串的处理过程:

aaaaBbBBBbCDdefghiIIiJ
aaaBbBBBbCDdefghiIIiJ
aaBbBBBbCDdefghiIIiJ
aBbBBBbCDdefghiIIiJ

也就是说,我们拼接出重复的内容,始终保留第一次出现,直到没有重复为止。

顺便说一下,在实际应用中,您可能会选择使用正则表达式来解决问题,因为它可以提供更简洁的解决方案:

String input = "aaaaBbBBBbCDdefghiIIiJ";
input = input.replaceAll("(?i)(.)\\1+", "$1");
System.out.println(input);

这将打印:

aBCDefghiJ

在这里,我们只需告诉正则表达式引擎删除任何单个字母的所有重复项,仅保留系列中的第一个字母。


0

我有一种不同的方法来实现你的目的,而且我认为你的代码太昂贵了,以至于无法去除重复字符(忽略大小写,只保留第一个)。

public static String removeDup(String s) {
char[] chars = s.toCharArray();
StringBuilder sb = new StringBuilder();
for (int i = chars.length - 1; i > 0; i--) {
  if (chars[i] == chars[i - 1]) {
    continue;
  }
  if (chars[i] < 97) {
    if (chars[i] == (chars[i - 1] - 32)) {
      continue;
    }
  } else {
    if (chars[i] == (chars[i - 1] + 32)) {
      continue;
    }
  }
  sb.append(chars[i]);
}
sb.append(chars[0]);
return sb.reverse().toString();}

对于输入 "aaaaBbBBBbCDdefghiIIiJ",输出将为 "aBCDefghiJ"。

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