package Lv1; import java.util.*; public class 字符消除 { // f(s):返回消除s连续相同字符的个数 private static int f(String s) { int ans = 0; StringBuffer sb = new StringBuffer(s); while (!different(sb.toString())) {//这个循环是如果还有连续的重复子串 那就接着消除 for (int i = sb.length() - 1; i > 0; i--) {//这里需要倒着消除 和序号有关系 这里利用了可变数组的消除 if (sb.charAt(i) == sb.charAt(i - 1)) {// 出现了重复子串 int j = i - 1; while (j > 0 && sb.charAt(j) == sb.charAt(i))//一旦i出现了重复子串 那么就是使用j去遍历全部的连续的字符 j--; //所有分开了两个情况讨论 if (j == 0 && sb.charAt(0) == sb.charAt(i)) {// 直接去到0的话 这里有一个边界的问题 sb = sb.delete(j, i + 1); ans += (i + 1) - j; break; } sb = sb.delete(j + 1, i + 1); ans += (i + 1) - (j + 1); i = j + 1;// 之后还有i-- } } } return ans; } // different(s): 判断是否有连着的相同的 private static boolean different(String s) { // 因为只有ABC 所以只要判断AA BB CC 这样的子串是否存在 // 如果存在返回false if (s.contains("AA")) return false; if (s.contains("BB")) return false; if (s.contains("CC")) return false; return true; } public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=Integer.parseInt(sc.nextLine().trim()); String[] ss=new String[n]; for(int i=0;i<n;i++){ ss[i]=sc.nextLine().trim(); } for(int i=0;i<n;i++){ int max=Integer.MIN_VALUE; for(int j=0;j<=ss[i].length();j++){//各个位置插入 for(char k=‘A‘;k<=‘C‘;k++){ StringBuffer sb=new StringBuffer(ss[i]); sb=sb.insert(j, k); int t=f(sb.toString()); max=Math.max(max, t); } } System.out.println(max); } } }
原文地址:https://www.cnblogs.com/Rowry/p/10660306.html
时间: 2024-10-29 09:56:35