我正在尝试编写一个删除重复字符的代码。例如 - 如果我们有一个字符串 "aabacdc"
,我们希望将其设置为 "abd"
。如果该字符在字符串中出现两次,那么我们将像上例中那样删除这两个字符。 'a'
在我们的字符串中出现了 3 次,因此我们只删除了 2 个 a
并留下了 1 个。
我在这段代码中尝试做的是使用两个嵌套的 for
循环 - 第一个 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。
每当您在按索引迭代时从结构中删除元素时,都需要向后循环该结构,以便在删除元素时索引值不会发生变化。这意味着您应该只删除外循环当前所在或已经看到的元素(即只删除索引 >= 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);
关于java - 从字符串中删除字符的所有匹配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43036685/