思路是:
1.判断字符串是否是由'q' 'b' 'l'组成的字符串,如果是就直接输出Yes,因为这样的字符串都可以通过往开头添加若干个q' 'b' 'l'组成回文字符串。
2.如果不是第一种情况就把字符串本身去判断是否是回文字符串,如果是就直接输出Yes
3.如果不是就把字符串分成三部分,第一部分是开头包含l、q、b的部分,第二部分是中间不包含l、q、b的部分,第三部分是结尾包含l、q、b的部分。
然后再去判断第二部分是不是回文字符串,如果不是就直接输出No,因为它不能通过往开头添加使之变成回文字符串了因为它的核心部分就不是回文的,如果第二部分是回文字符串,那就设置两个指针i、j分别指向第一部分的结尾和第三部分的开头,如果指向的字符相等,则i--,j++。如果循环结束了,就有三种情况,1.两指针同时走出界,表明所遍历的字符都相等是回文字符串。(实际这就是本身就是回文字符串的情况)2.如果i先走出界,第一部分先走完,就去遍历第三部分剩余部分,如果剩余部分都是在l、q、b之内的就输出Yes,有一个不属于其中就是No。3.如果j先走出界,表明开头的第一部分还有多余的字符,此时仅有添加操作无论如何也构成不了回文字符串的。输出No
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n=scan.nextInt();
scan.nextLine();//消耗掉一行
for(int i=0;i<n;i++)
{
String str=scan.nextLine();//接收每一行字符串
char arr[]=str.toCharArray();//把字符串转换成字符数组
int k;
for(k=0;k<arr.length;k++)
{
if(arr[k]!='l' && arr[k]!='q' && arr[k]!='b')
{
break;
}
}
if(k>=arr.length)
{
System.out.println("Yes");
continue;
}
if(reply(arr)==true)//如果本身就是回文字符串直接返回Yes
{
System.out.println("Yes");
}
else//如果本身不是回文字符串就把原字符串分成三部分
{
int start=0;
int end=arr.length-1;
while(arr[end]=='l' || arr[end]=='q' || arr[end]=='b')
{
end--;
}
char[] sub3=str.substring(end+1,arr.length).toCharArray();//第三部分
while(arr[start]=='l' || arr[start]=='q' || arr[start]=='b')
{
start++;
}
char[] sub1=str.substring(0,start).toCharArray();//第一部分
char[] sub2=str.substring(start,end+1).toCharArray();//第二部分
start=sub1.length-1;//为第一部分的结尾
end=0;//为第三部分的开头
if(reply(sub2))
{
while(start>=0 && end<=sub3.length-1)
{
if(sub1[start]!=sub3[end])
{
System.out.println("No");
break;
}
start--;
end++;
}
if(start>=0)//sub3先走完
{
System.out.println("No");
break;
}
else//sub1先走完
{
while(end<=sub3.length-1)
{
if(sub3[end]!='l' && sub3[end]!='q' && sub3[end]!='b')
{
System.out.println("No");
break;
}
end++;
}
if(end>sub3.length-1)//判断是否是循环走完了
{
System.out.println("Yes");
}
}
}
else
{
System.out.println("No");//如果第二部分不是回文字符串就直接No
}
}
}
scan.close();
}
public static boolean reply(char[] arr){//检查是否为回文字符串
int i=0;
int j=arr.length-1;
while(i<j)
{
if(arr[i]!=arr[j])
return false;
i++;
j--;
}
return true;
}
}