Java 遍历字符串中的字符并删除连续的重复项

Java 遍历字符串中的字符并删除连续的重复项,java,string,algorithm,replace,duplicates,Java,String,Algorithm,Replace,Duplicates,我试图遍历一个字符串并删除连续重复的字母 ABBACBAABCB-->AACBAABCB-->CBAABCB-->CBBCB-->CCB-->B 我的想法是迭代字符串并在do-while循环中删除重复项 我的代码: 主类{ 公共静态字符串list=“abbacbcbcb”; 公共静态布尔值notvalid=true; 公共静态void main(字符串[]args){ 做{ 字符串r=不可撤销(列表); isvalid(r); //list=r不工作 }while

我试图遍历一个字符串并删除连续重复的字母

ABBACBAABCB-->AACBAABCB-->CBAABCB-->CBBCB-->CCB-->B
我的想法是迭代字符串并在do-while循环中删除重复项

我的代码:

主类{
公共静态字符串list=“abbacbcbcb”;
公共静态布尔值notvalid=true;
公共静态void main(字符串[]args){
做{
字符串r=不可撤销(列表);
isvalid(r);
//list=r不工作
}while(无效);
}
公共静态字符串速率(字符串str){
for(int i=1;i
显然这不起作用,它只是永远循环

根据我收集的信息,您无法在java上执行
list=results
,因为字符串是不可变的

如何使用Java实现这一点?

class Main{
公共静态字符串list=“abbacbcbcb”;
公共静态布尔值notvalid=true;
public static char[]oList=list.toCharArray();
公共静态void main(字符串[]args){
做{
char[]r=不饱和脂肪酸(oList);
oList=r;
isvalid(oList);
}while(无效);
对于(int i=0;i=arr.length){
返回arr;
}
char[]另一个数组=新字符[arr.length-1];
for(int i=0,k=0;i
这就是有效的代码。
将字符串转换为字符数组并操作字符数组。

您应该使用这样的堆栈

static String removeConsecutiveDupplicatesLetter(String s) {
    Stack<Character> stack = new Stack<>();
    for (char c : s.toCharArray())
        if (!stack.isEmpty() && stack.peek() == c)
            stack.pop();
        else
            stack.push(c);
    return stack.stream().map(String::valueOf).collect(Collectors.joining());
}
stack    c
-------  -
[]       A 
[A]      B
[A B]    B
[A]      A
[]       C
[C]      B
[C B]    A
[C B A]  A
[C B]    B
[C]      C
[]       B
[B]
结果:

B
这个是这样工作的

static String removeConsecutiveDupplicatesLetter(String s) {
    Stack<Character> stack = new Stack<>();
    for (char c : s.toCharArray())
        if (!stack.isEmpty() && stack.peek() == c)
            stack.pop();
        else
            stack.push(c);
    return stack.stream().map(String::valueOf).collect(Collectors.joining());
}
stack    c
-------  -
[]       A 
[A]      B
[A B]    B
[A]      A
[]       C
[C]      B
[C B]    A
[C B A]  A
[C B]    B
[C]      C
[]       B
[B]
您还可以使用
char[]
作为堆栈,而不是
stack

static String removeConsecutiveDupplicatesLetter(String s) {
    int length = s.length();
    char[] stack = new char[length];
    int index = 0;
    for (char c : s.toCharArray())
        if (index > 0 && stack[index - 1] == c)
            --index;
        else
            stack[index++] = c;
    return new String(stack, 0, index);
}
您可以使用regexp和单个do while循环:

String str=“abbacbcbcb”;
做{
系统输出打印项次(str);
}而(!str.equals(str=str.replaceFirst(()\\1,“”));
输出:

ABBACBAABCB
AACBAABCB
CBAABCB
CBBCB
CCB
B
说明:

  • regexp
    ()\\1
    -后跟相同字符的任何字符
  • str=str.replaceFirst(…)
    -按顺序逐个删除重复项并替换当前字符串
  • !str.equals(…)
    -检查当前字符串本身的不相等性,但不检查重复项


另请参见:

由于字符串是不可变的,因此必须通过迭代字符串并将要保留的字符复制到单独的位置来完成此操作。如何做到这一点并跳过重复项?手动将字符串转换为数组,然后对数组执行相同的操作?您将无法在适当的位置执行此操作,您将需要单独的输入和输出位置。你不需要手动使用数组。我发布了我解决它的方法。如果你有更优雅的解决方案,我很感兴趣。我的感觉很复杂,tbh,我认为字符串在默认情况下是字符数组。字符串
“AAAB”
的预期结果是什么,两个
A
字符抵消以生成
“AB”
,或者所有三个字符抵消以生成
“B”
?有趣的是,我需要导入一个库来创建这些“堆栈”吗?我可以制作任何类型变量的堆栈吗?我在哪里可以找到他们的方法?至于你代码的逻辑,老实说,我不理解。如果有人能证实这一点,我将标记为答案。提前感谢。您只能使用标准库来实现它。您应该导入
java.util.Stack
。感谢添加的解释。我明白你的逻辑了,我还是有点迷茫你的回报?我不熟悉流、地图和收藏家。你能不能把堆栈还给我?@a1a1a1好的,我添加了更简单的解决方案。再次感谢你,这一点我完全理解。