Codility Disappearing Pairs问题:偶数长回文用例错误求助
Codility Disappearing Pairs问题求助
我在Codility平台完成Disappearing Pairs训练题,题目要求如下:
给定仅含A、B、C的字符串S,反复移除其中的"AA"、"BB"或"CC",直到无法操作,返回最终字符串。
我编写的Java代码仅得83分,在even_palindrome1(长偶数长度回文)用例上出错:输出非空字符串,但预期结果为空,不清楚错误原因,请求帮助。
我的代码:
public String solution(String S) { boolean notAA = false; boolean notBB = false; boolean notCC = false; while(S.length()==0 || true){ if (S.contains("AA")){ S = S.replace("AA", ""); } else { notAA = true; } if(S.contains("BB")){ S = S.replace("BB", ""); } else { notBB = true; } if(S.contains("CC")){ S = S.replace("CC", ""); } else { notCC = true; } if(notAA && notBB && notCC){ break; } } return S; }
题目示例:
- 输入"ACCAABBC",返回"AC"
- 输入"ABCBBCBA",返回""
- 输入"BABABA",返回"BABABA"
错误详情:even_palindrome1用例(长偶数长度回文),输出非空字符串,预期为空。
错误原因分析
你的代码逻辑存在两个关键问题:
- 标记变量未重置:每次循环中,
notAA、notBB、notCC一旦设为true就不会重置。比如处理回文字符串"ABBA"时,第一次循环检查到无"AA",notAA=true;接着替换"BB"得到"AA",但此时notAA已经是true,循环直接终止,不会处理新生成的"AA",最终返回"AA"而非空。 - 替换逻辑不彻底:
String.replace()会一次性替换所有当前存在的目标子串,但替换后可能产生新的相邻重复对,你的代码无法循环处理这些新产生的重复对,因为标记变量的状态会阻止后续检查。
正确解法(栈实现)
这类消除相邻重复元素的问题,最适合用栈结构处理,能彻底处理所有可能的连续消除场景:
public String solution(String S) { StringBuilder stack = new StringBuilder(); for (char c : S.toCharArray()) { int stackLen = stack.length(); // 如果栈不为空,且栈顶元素和当前字符相同,弹出栈顶(消除一对) if (stackLen > 0 && stack.charAt(stackLen - 1) == c) { stack.deleteCharAt(stackLen - 1); } else { // 否则将当前字符压入栈 stack.append(c); } } return stack.toString(); }
思路说明:
遍历字符串的每个字符,维护一个栈(用StringBuilder模拟,效率更高):
- 若栈不为空且栈顶字符与当前字符相同,说明遇到可消除的重复对,弹出栈顶元素;
- 若不满足消除条件,将当前字符压入栈;
- 遍历结束后,栈中剩余的字符就是无法再消除的最终结果。
这种方式能处理所有嵌套或连续生成的重复对,比如"ABBA"会被逐步消除为空,完美解决even_palindrome1用例的问题。
内容的提问来源于stack exchange,提问作者Cristian Perez
相关产品推荐
相关产品推荐

