一、思路
1.这题去年考的时候想的是使用全排列进行尝试,实际不用这么麻烦,只用找到第一个和最后一个非特殊字符串的位置,然后分别向内检查是否对称,向外检查是否对称直到左指针小于0(可以通过添加使其对称)
2.至于如何找到第一个和最后一个非特殊字符串的位置,这里用的栈,其实很多种方法,设两个下标记录,ArrayList等都可以
二、记忆
1.分析题目看看能不能找出规律
三、代码
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
in.nextLine();
for(int i =0;i<n;i++) {
String ss = in.nextLine();
if(check(ss)) {
System.out.println("Yes");
}else {
System.out.println("No");
}
}
}
public static boolean check(String ss) {
Deque<Integer> stack = new LinkedList();
int n = ss.length();
for(int i =0;i<n;i++) {//找到所有非指定字符的位置
char temp = ss.charAt(i);
if(temp!='l' && temp!='q' && temp!='b') {
stack.add(i);
}
}
if(stack.size()==0) {
return true;
}
int left = stack.getLast(),right = stack.getFirst();
int l = stack.getLast(),r= stack.getFirst();
while(left < right && ss.charAt(left)==ss.charAt(right)) {//两边向中间
left++;
right--;
}
while(l>=0 && ss.charAt(l) == ss.charAt(r)) {//两边向两边
l--;
r++;
}
if(left>=right && l<0) {
return true;
}else {
return false;
}
}
}