Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中消除重复字符的算法_Java_Algorithm - Fatal编程技术网

Java中消除重复字符的算法

Java中消除重复字符的算法,java,algorithm,Java,Algorithm,我正在做一份声明 有一个字符串,由小写英文字母组成。在一个操作中,我们可以删除任何一对具有相同值的相邻字母 例如,字符串“aabcc”在操作后将变为“aab”或“bcc” 结果应该尽可能地减少。为此,我们必须尽可能多次重复上述操作 例如: case 1: Input - aaabccddd Output - abd 这里的操作顺序如下: aaabccddd → abccddd abccddd → abddd abddd → abd 您可以参考以上链接了解更多详细信息 我尝试使用列表解决问题

我正在做一份声明

有一个字符串,由小写英文字母组成。在一个操作中,我们可以删除任何一对具有相同值的相邻字母

例如,字符串“aabcc”在操作后将变为“aab”或“bcc”

结果应该尽可能地减少。为此,我们必须尽可能多次重复上述操作

例如:

case 1:

Input - aaabccddd
Output - abd
这里的操作顺序如下:

aaabccddd → abccddd
abccddd → abddd
abddd → abd
您可以参考以上链接了解更多详细信息

我尝试使用列表解决问题,但我发现这不是正确的方法:

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String data = scan.next();
        scan.close();
        
        String[] dataArr = data.split("");
        
        List<String> elements = Arrays.asList(data.split(""));
        
        for(int i=0; i< elements.size()-1; i++) {
            if(elements.get(i).equals(elements.get(i+1))) {
                elements.remove(i);
                elements.remove(i+1);
            }
        }
        System.out.println(elements);
    }
}
导入java.util.array;
导入java.util.List;
导入java.util.Scanner;
公共类解决方案{
公共静态void main(字符串[]args){
扫描仪扫描=新扫描仪(System.in);
字符串数据=scan.next();
scan.close();
字符串[]dataArr=data.split(“”);
列表元素=Arrays.asList(data.split(“”));
对于(int i=0;i
我得到的错误是:
java.lang.UnsupportedOperationException

请帮助我解决此问题的正确方法。

创建不可修改的列表,检查文档:

返回指定数组支持的固定大小的列表

不能从中删除元素。尝试:

List<String> elements = new ArrayList(Arrays.asList(data.split("")));
List elements=newarraylist(Arrays.asList(data.split(“”));
描述代码中出现异常的具体原因

与拆分为列表相比,更简单的解决方案是按字符串顺序进行迭代:

StringBuilder sb = new StringBuilder();
int i = 0;
while (i < str.length()) {
  if (i + 1 < str.length() && str.charAt(i) == str.charAt(i + 1)) {
    i += 2;
  } else {
    sb.append(str.charAt(i));
    i += 1;
  }
}
String result = sb.toString();
StringBuilder sb=新建StringBuilder();
int i=0;
而(i
除了@marounnaroun的修复外,在从正在迭代的列表中删除值时需要小心

for(int i=0; i< elements.size()-1; i++) {
    if(elements.get(i).equals(elements.get(i+1))) {
        elements.remove(i);
        elements.remove(i+1); // not the index you think it is 
    }
}
或者你可以写:

for(int i=0; i< elements.size()-1; i++) {
    if(elements.get(i).equals(elements.get(i+1))) {
        elements.remove(i+1);
        elements.remove(i);
    }
}
for(int i=0; i< elements.size()-1; i++) {
    if(elements.get(i).equals(elements.get(i+1))) {
        elements.remove(i);
        elements.remove(i);
    }
}
for(int i=0;i
最简单的方法是使用正则表达式(我上次解决了这个问题)

// Somehow read input and store it in a String input
String regex = "(.)\\1";

Pattern r = Pattern.compile(regex);
Matcher m = r.matcher(input);
while (m.find()) {
    input = m.replaceAll("");
    m = r.matcher(input);
}
// check length, do other things and print

谢谢@OleV.V。对于指出字符串转义错误

现在我们已经帮了很多忙,询问者已经接受了答案,请允许我提供我的解决方案:

    StringBuilder result = new StringBuilder(input.length());
    for (int ix = 0; ix < input.length(); ix++) {
        char ch = input.charAt(ix);
        if (endsWith(ch, result)) {
            removeLastChar(result);
        } else {
            result.append(ch);
        }
    }
    String output = result.toString();

生成的列表不支持删除操作。(它只包装初始化时使用的数组,不能调整数组的大小。)您可以改为使用。请注意,如果要从列表中删除,则不应向前迭代列表:您将错过元素,或处理您不希望看到的元素。更好的方法是将未删除的内容添加到新字符串中。小贴士:寻求帮助解决培训挑战实际上会挫败学习purpose@amitosh,这在很大程度上是正确的。另一方面,你不会从尝试、陷入困境和不得不放弃中学到很多东西。只是吹毛求疵、固定大小和不可修改是不一样的。可以替换固定大小列表中的图元,从而对其进行修改。这里重要的一点是,正如您所说,您不能从中删除任何元素。哎呀,您需要转义反斜杠,如
“(..\\1”
。您编写的程序编译和运行时没有任何错误迹象,只是不删除任何字符。@OleV.V。感谢大家指出,我从recall编写了这段代码,现在我使用了这么多Python和JS。。。忘记逃避事实上这应该是正确的答案。这是正确的O(N)方法!接受的答案在
baab
@amitosh上失败,因此将其放入循环中。
private static boolean endsWith(char ch, StringBuilder buf) {
    return buf.length() > 0 && buf.charAt(buf.length() - 1) == ch;
}

private static void removeLastChar(StringBuilder buf) {
    buf.setLength(buf.length() - 1);
}