Java实现持续移除字符串相邻重复字符的问题求助
彻底移除字符串中所有相邻重复字符的Java实现
你的原代码仅能完成一轮相邻重复字符的过滤,无法处理移除重复后新产生的相邻重复(比如移除中间字符后,前后字符变成相邻重复的情况)。要彻底解决这个问题,栈结构是最适合的方案——它可以在遍历过程中实时检查并移除相邻重复,包括动态产生的新重复。
最优实现代码
import java.util.Scanner; public class RemoveAdjacentDuplicates { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.print("请输入字符串:"); String input = scan.nextLine(); scan.close(); // 用StringBuilder模拟栈,效率比Stack类更高 StringBuilder result = new StringBuilder(); for (char c : input.toCharArray()) { int length = result.length(); // 检查栈顶字符是否和当前字符相同 if (length > 0 && result.charAt(length - 1) == c) { // 相同则弹出栈顶(移除重复) result.deleteCharAt(length - 1); } else { // 不同则压入栈 result.append(c); } } System.out.println("处理后的字符串:" + result.toString()); } }
代码逻辑说明
- 用
StringBuilder模拟栈:它的append(压入)和deleteCharAt(弹出栈顶)操作都是O(1)时间复杂度,整体遍历仅需O(n)时间,效率极高。 - 遍历输入字符串的每个字符:
- 如果栈不为空,且栈顶字符和当前字符相同,说明出现相邻重复,直接移除栈顶字符。
- 如果栈为空或栈顶字符和当前字符不同,就把当前字符加入栈中。
- 遍历结束后,
StringBuilder中保存的就是完全移除所有相邻重复后的结果。
测试示例
输入:aabaarbarccrabmq
输出:bmq(经过多轮动态移除后,最终所有相邻重复都被清理)
内容的提问来源于stack exchange,提问作者Jacob Silva
相关产品推荐
相关产品推荐

