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