import java.util.ArrayList; import java.util.Scanner; public class Main { /* 思路解析 1. 为了节省内存空间,不考虑线程安全的情况, 使用StringBuilder处理字符串效率最高(直接使用String可能会堆溢出) 2. StringBuilder没有获取指定下标的字符方法, 所以只能使用substring(i, i + 1)获取第i个下标的字符串 3. 在判断两相邻的字符是否相等的过程中,为确保无遗漏,每次判断相等删除后, 都要返回到本次循环的i的上一次,也就是i - 1, 但如果全程都返回到本次循环的上一次,那么i=0时会报错(i会==-1) 4. 所以遍历比较的过程中使用if分开判断,同时恰好if和else不会同时执行, 所以不会让内存使用变大 */ public static void main(String[] args) { Scanner in = new Scanner(System.in); StringBuilder stringBuilder = new StringBuilder(in.next()); for (int i = 0; i < stringBuilder.length() - 1; i++) { //遍历stringBuffer if (i == 0) { //如果i==0,则不能返回到本次循环i下标的前一位 //只能返回到本次循环的i下标,也无遗漏 String sb1 = stringBuilder.substring(i, i + 1); //获取下标为i的字符串 String sb2 = stringBuilder.substring(i + 1, i + 2); //获取下标为i+1的字符串 if (sb1.equals(sb2)) { //如果i下标和i+1下标的字符串相等 stringBuilder.delete(i, i + 2); //删除i 到 i + 1的字符串 i--;//返回到本次循环的i下标 } } else { //如果i不等于0,则返回到本次循环i下标的前一位,确保无遗漏 String sb1 = stringBuilder.substring(i, i + 1); //获取下标为i的字符 String sb2 = stringBuilder.substring(i + 1, i + 2); //获取下标为i+1的字符 if (sb1.equals(sb2)) { //如果i下标和i+1下标的字符串相等 stringBuilder.delete(i, i + 2); //删除i 到 i + 1的字符串 i-=2;//返回到本次循环的前一位 } } } if (stringBuilder.length() == 0){ //如果stringBuffer的长度==0,说明字符串已被清空,输出0 System.out.println(0); } else { //如果stringBuffer的长度不等于0,说明字符串没被清空,输出该字符串 System.out.println(stringBuilder); } } }