算法题:回文串(蘑菇街2016招聘笔试)

 名企笔试:蘑菇街2016招聘笔试(回文串)
题目描述

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

输入描述:

一行一个由小写字母构成的字符串,字符串长度小于等于10。

输出描述:

输出答案(YES\NO).

输入例子:

coco

输出例子:

YES


java版本的代码实现:

package cn.cat.algorithm;


public class PalindromeString {
	/**
	 * 
	 * 所谓回文串,即时指正向读和反向读都一样的字符串,例如level,noon等字符串。
	 * 分析:
	 * 		1、如果本身出入的字符串已经符合回文情形,那么再添加一个字母也肯定能得到回文字符串。
	 *      2、如果本身字符串不是回文情形,则需要判断缺乏多少个字母才能形成回文,如果超过两个字母以上,则当前字符串不符合要求,输出NO。
	 *      3、判断字符串回文的方式,首元素和最末尾元素比对,第二个元素和倒数第二个元素比对,以此类推比对,
	 *         如果字符数组的长度是偶数,一直到前后两个数组下标相遇,则符合回文情形。
	 *         如果字符数组的长度是是奇数,则两个属于下标在剩余元素的两侧,则符合回文情形。
	 *      
	 * 	
	 * 
	 * 
	 * @Description: 
	 * @author gwj
	 * @Created 2018年4月17日 下午2:40:27 
	 * @param args
	 */
	public static void main(String[] args) {
		String str = "coco";
		str = "caba";
		str = "cbbkakbc";
		str = "cbkakbbc";
		
		str = "ccccckakccccbc";
		str = "cbabbc";
		
		char[] charArr = str.toCharArray();
		//是否出现字符空缺
		boolean isLackChar = false;
		//是否可以回文。假定只有字符串有内容,都可以回文。
		boolean isCanPalindrome = charArr.length > 0;
		int frontIndex = 0;
		int behindIndex= charArr.length - 1;
		while (frontIndex < behindIndex) {
			if (charArr[frontIndex] == charArr[behindIndex]) {
				frontIndex ++ ;
				behindIndex -- ;
			} else {
				//超过一次字母缺少的情形,没法回文。
				if (isLackChar) {
					isCanPalindrome = false;
					break;
				}
				
				/* 如果已经出现了没法匹对的字符,则判断下一个字符是否相同,不能有错开两个
				 * 字符都没法相等的情况,因为只能插入一个字母来使其回文。
				 */
				if (charArr[frontIndex + 1] == charArr[behindIndex]) {
					//允许插入一个字母使其匹配,直接将前置索引调到下一个。
					frontIndex ++;
					isLackChar = true;
				} else if (charArr[frontIndex] == charArr[behindIndex - 1]) {
					//允许插入一个字母使其匹配,直接将后置索引往前移动一个。
					behindIndex --;
					isLackChar = true;
				} else {
					//超过两个字符没法对应,不可回文
					isCanPalindrome = false;
					break;
				}
			}
			
		}
		
		//输出
		if (isCanPalindrome) {
			System.out.println("YES");
		} else {
			System.out.println("NO");
		}
	}
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值