字符串添加一个字母将其变为回文串

题目描述

给定一个字符串,问是否能通过添加一个字母将其变为回文串。

输入描述:
一行一个由小写字母构成的字符串,字符串长度小于等于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;
			 
		 }
		 
		 
	 }




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值