题目描述
给定一个字符串,问是否能通过添加一个字母将其变为回文串。
输入描述:
一行一个由小写字母构成的字符串,字符串长度小于等于10。
输出描述:
输出答案(YES\NO).
输入例子:
coco
输出例子:
YES
问题分析:首先缺了一个字符的回文串是怎样的
1、在头部、尾部缺 如 abcb(在尾部缺) bdffdbe(在头部缺)
------这种类型只要把首部、或者尾部的一个字符串去掉,那天还是一个回文字符串
2、在中间部分缺 如: abcdrfcrdcbae这种情况,只要把首尾相同的字符去掉,就又会出现 1 的这种情况
abcdrfcrdcba————————>fc
abcdrfcrbae-------> cdrfcr
3、还有一种情况就是在最中间缺,这种情况,就算他缺了一个字符,它还是一个回文字符串 如: aba abba
public class main7 {
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String input=sc.next();
doIt(input);
}
}
public static void doIt(String input){
int i=0,j=input.length()-1;
while(i<j&&input.charAt(i)==input.charAt(j)){
i++;j--;
}; //把首尾相同的元素去掉
// System.out.println(i+" "+ j);
if(i>=j) { //这就是中间缺的情况
System.out.println("YES");
return;
}
else{
if(input.charAt(i+1)==input.charAt(j)){
i++;
while(i<j&&input.charAt(i)==input.charAt(j)){
i++;j--;
}; //把首尾相同的元素去掉
if(i>=j) { //这就是中间缺的情况
System.out.println("YES");return;
}
}
if(input.charAt(i)==input.charAt(j-1)){
j--;
while(i<j&&input.charAt(i)==input.charAt(j)){
i++;j--;
}; //把首尾相同的元素去掉
if(i>=j) { //这就是中间缺的情况
System.out.println("YES");return;
}
}
}
System.out.println("NO");
}
代码很贵一斤,可以换成递归实现减少代码
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String input=sc.next();
boolean b = doIt02(input,0,input.length()-1,1);
System.out.println(b?true:false);
}
}
public static boolean doIt02(String input,int start,int end ,int deep){
if(start>=end){
return true;
}
if(input.charAt(start)==input.charAt(end)){
return doIt02(input,start+1,end-1,deep);
}
else{
if(deep==1){
return doIt02(input,start+1,end,deep+1)||doIt02(input,start,end-1,deep+1);
}
return false;
}
}