目录
1 题目描述
给定一个仅由小写字母组成的字符串。现在请找出一个位置,删掉那个字母之后,字符串变成回文。请放心总会有一个合法的解。如果给定的字符串已经是一个回文串,那么输出-1。
2 解题思路
输入一个字符串,判断其是否为回文,若为回文,输出-1;若不是回文,则删除该字符串中的一个字符,使其变成回文结构,并且返回该字符对应的下标。首先我们不难想到:定义一个judge函数来判断该字符串是否是回文,若是返回-1;若不是返回构不成回文的字符下标,此时有两种情况:类似于abbbbb、bbbbbbcb,有可能返回前半部分不构成回文结构的字符下标, 也有可能是后半部分的某个下标,但是这两个下标之间是有相关性的:两者之和为字符数组长度,所以在对返回值进行判定时,可以将返回字符删除,再进行一次判断,若返回-1则说明该位置是不构成回文结构的字符,返回该字符下标即可;否则返回与之互补的下标即可。
3 代码实现
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
for (int i = 0; i < n; i++) {
String s = bf.readLine();
int res = judge(s);
//若该字符串为回文结构,直接输出-1
if (res == -1){
System.out.println(-1);
}else {
//记录下不是回文结构的字符的下标。
int x = res;
//将影响回文结构的字符进行删除
String str = s.substring(0,x)+s.substring(x+1,s.length());
//再次进行判断,并取得返回值。此处需要注意的是,类似于abbbb,bbbbbcb这种
//回文结构,返回值中影响回文结构的字符下标可能在前半部分,也可能在后半部分
//题目已经明确的告诉我们了:总有一个合法的解,所以这两种返回情况无可厚非~
int a = judge(str);
if (a == -1){
//若返回值为-1,说明该位置的字符影响了结构
System.out.println(x);
}else {
//否则就是与x位置对称的字符影响了回文结构
System.out.println(s.length()-1-x);
}
}
}
}
//判断一个字符串是否是回文结构,若是,返回-1;若不是,返回不相等处字符的索引下标
public static int judge(String str){
int i = 0;
int j = str.length()-1;
char[] chars = str.toCharArray();
while (i < j){
if (chars[i]!=chars[j]){
//如果遇到不相等的字符,返回该字符所对应的下标
return i;
}
i++;
j--;
}
//在循环中没有return出去,说明该字符串为回文结构
return -1;
}
}