对于字符串的处理
本题是输入一个数据,让我们判断是否可以变成回文,我们能做的只有头插指定的字符。
初次遇到本题,也是一头雾水,仔细想想后发现( 其实是错的,但我当时以为是对的)一个思想。
然后埋头苦干,最先发现漏洞很多,无法实现。
因此,做题第一步,找对做法很重要。
我们先思考这题如何求解,一个字符串判断是否回文,就是看逆序后的字符串是否与之相等。
而题目赋予我们能做的事只有头插指定的字符。
因此我们依据这个能力, 我们想到若要变成回文字符串,说明开头部分与结尾部分对应相等。
也就是说,若结尾部分是由指定的字符组成的,我们便可以构造一个相同的字符集,将其插到开头。
这样我们就能使开头与结尾对应,形成回文,然后只剩下中间部分。
只要开头部分 到 结尾部分 的中间几个字符是回文的,我们就可以认为整个字符串是回文的。
因此我们要将一整个字符串分成三个部分,开头、中间、结尾。
我们将一个字符串的从头开始的全是指定字符的拿来做开头,从尾开始的拿来做结尾,其余的就是中间部分。
这么划分有啥好处,答案就是方便与准确,中间部分与开头和结尾互不干扰,分化成小问题方便求解。
我们插入开头的只有指定的字符,那为什么我们不把原本字符串开头的指定字符也拿过来当开头。
这样我们就能确定开头的范围。
结尾也是同理,我们构建好了前两者,中间自然也就构建好了。
然后就判断中间部分是否回文,否的话直接no,是的话继续判断开头能否与结尾相对应。
具体实现细节与注意事项
1.要注意特殊情况,我们发现若是开头结尾都为空,也就是字符串全是中间部分。开头和结尾重合,也就是没有中间部分的情况。
需要注意自己的代码是否符合条件。
2.java的库的使用
字符串逆序输出可以使用StringBuffer或者StringBuilder的reverse方法,方便快捷。
String的各种方法使用
代码
// package lianxi5996;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class Main {
static String str;
public static boolean isHuiWen(int left, int right) {
for(int i = left; i <= (left + right) >> 1; i++) {
if(str.charAt(i) != str.charAt(right - i + left)) return false;
}
return true;
}
static char[] data = new char[]{108, 113, 98};
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pr = new PrintWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
// 思路为将一个字符串分成三个部分, a.b.c, a为左半边全是指定字符, c是右半边全是指定字符。
// 只要b不是回文, 一定是no
// 若b是回文, 只要a 能等于 c, 则yes
while(n -- > 0) {
str = br.readLine();
int left = 0, right = str.length() - 1;
boolean b = true;
// t用来判断是否整个字符串都是规定字符, 若是则可以直接输出yes
boolean t = false;
// 确定a部分
for(int i = 0; i < str.length(); i++) {
int a = str.charAt(i);
boolean isD = false;
for(int x : data) {
if(a == x) {
isD = true;
}
}
if(!isD) {
left = i;
break;
}
if(i == str.length() - 1) t = true;
}
if(t) {
pr.println("Yes");
continue;
}
// 确定c部分
for(int i = str.length() - 1; i >= 0; i--) {
int a = str.charAt(i);
boolean isD = false;
for(int x : data) {
if(a == x) {
isD = true;
}
}
if(!isD) {
right = i;
break;
}
}
// 判断b部分是否是回文
if(isHuiWen(left, right)) {
String l = str.substring(0, left);
String r = str.substring(right + 1, str.length());
StringBuffer ri = new StringBuffer(r).reverse();
r = ri.toString();
if(r.contains(l)) pr.println("Yes");
else pr.println("No");
} else {
pr.println("No");
}
}
pr.flush();
}
}