方法一:利用字符串拼接来删除一个字符来达到求删除一个字符使得回文的坐标
public class Solution { /** * @param str: 字符串 * @param start: 左边需要删除的字符坐标 * @param end: 右边需要删除的字符坐标 * [str, start, end] * @return boolean 回文的真值 * @description TODO 判断字符串是否回文并且利用数组两个数组来存储需要删除字符的坐标 */ public static boolean isPalindrome(StringBuilder str,int [] start,int[] end){ //两个坐标用于遍历坐标判断是否回文 int i=0; int j=str.length()-1; //标记字符串回文的真值 boolean flag=true; while(i<=j){ if(str.charAt(i)==str.charAt(j)){ i++; j--; }else{ //不相等的话说明找到了一个要删除的字符的位置 flag=false;//不是回文 break;//退出循环 } } //可以删除前后字符的任意一个,把要删除的坐标放入数组中 if(start!=null){ start[0]=i; } if(end!=null){ end[0]=j; } return flag; } public static void main(String[] args){ Scanner scan=new Scanner(System.in); //输入字符串的个数 int n=scan.nextInt(); //输入n个字符串 while(n>0){ //next函数会实现换行,nextline函数不实现换行,因为要找到删除掉的字符可以使字符串变成回文字符串的位置,所以需要可以改变的字符串类型 StringBuilder str= new StringBuilder(scan.next()); //接下来对每一行进行判断是不是回文 //判断是不是回文我们需要从字符串两边去判断,所以删除的字符是有两种可能的,可以用两个数组来分别存储两边的坐标 int[] start=new int[1];//只需要存储一个下标,存储左边的 int[] end=new int[1];//存储右边的 //判断回文 if(isPalindrome(str,start,end)){ System.out.println(-1); }else{ //不是回文就需要删除一个字符,如果我们删除后面的字符 str.deleteCharAt(end[0]); //导致这个字符串是回文的,那么这个坐标就是满足要求的 if(isPalindrome(str,null,null)){ //这里设置为null,是因为只需要删除一次字符,不需要再用数组存储要删除的字符了 //输出这个坐标 System.out.println(end[0]); }else{ //如果删除了后面的字符导致他还不是回文的,那么就表示应该删除前面的字符它才是回文的 //输出该坐标 System.out.println(start[0]); } } n--; } } }法二:直接利用字符串判断,不用删除字符,将字符串分成两部分,一个遍历左边部分,一个遍历右边部分
public class Solution { //法二:直接利用字符串判断,不用删除字符,将字符串分成两部分,一个遍历左边部分,一个遍历右边部分 //利用相邻字符是否相等来确定要删除字符的坐标 public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); while(num>0){ String str= scanner.next(); int len = str.length(); //存储最终要删除的字符的坐标 int ret=-1; //两个坐标,一个判断坐标部分,一个判断右边部分 for(int i=0;i<len/2;i++){ int j=len-1-i;//j坐标的求法 //判断回文 //不用再判断等于的情况了,直接判断不相等的情况,for循环,相等的情况坐标他会自己跳过去 if(str.charAt(i)!=str.charAt(j)){ //当前左边字符不等于右边字符,不是回文,那么就需要找删除的字符 if(str.charAt(i+1)==str.charAt(j)){ //如果当前字符的下一个字符等于右边字符,那么就表示当前字符是需要删去的,删除他 ret=i; }else if(str.charAt(i)==str.charAt(j-1)){ //当前字符等于右边字符的前一个字符,说明当前右边字符是需要删除的 ret=j; } //找到了,退出 break; } } //判断完一个字符串,需要输出对应要删除的字符坐标 System.out.println(ret); num--; } return; } }