从字符串中删除所有匹配的字符对

时间:2017-03-27 01:45:33

标签: java string

我试图制作一个删除重复字符的代码。例如 - 如果我们有一个字符串"aabacdc",我们希望将其设为"abd"。如果字符在字符串中存在两次,那么我们将删除这两个字符,如上例所示。 'a'在我们的字符串中出现了3次,因此我们删除了2 a并剩下1个。

我在这段代码中尝试做的是使用两个嵌套的for循环 - 首先用于循环来比较第一个字符和其他字符。如果字符在字符串中有重复,则只删除这两个字符。我该如何修复此代码?

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    String str2 = input.nextLine();

    StringBuilder str = new StringBuilder(str2);

    for (int k = 0; k < str.length() - 1; k++) {
        for (int i = 1; i < str.length() - 1; i++) {
            if (str.charAt(k) == str.charAt(i)) {
                str.deleteCharAt(k);
                str.deleteCharAt(i);
            } 
        }
    }

    System.out.println(str);
}

1 个答案:

答案 0 :(得分:2)

我根据您的预期输出对您尝试执行的操作的解释是,您希望一次从字符串1对中删除字符。因此,如果字符串中有一个奇数的字符,则应保留1,如果有,则应保留偶数0。

如果您在按索引进行迭代时从结构中删除元素,则需要向后循环结构,以便在删除元素时不会移动索引值。这意味着您应该只删除外部循环当前所处或已经看到的元素(即仅删除索引>= i处的元素)。

Scanner input = new Scanner(System.in);
String str = input.nextLine();
StringBuilder sb = new StringBuilder(str);

for (int i = sb.length() - 2; i >= 0; i--) {
    for (int j = i + 1; j < sb.length(); j++) {
        if (sb.charAt(i) == sb.charAt(j)) {
            sb.deleteCharAt(j);
            sb.deleteCharAt(i);
            break;
        }
    }
}

System.out.println(sb);

Ideone Demo