名企笔试:蘑菇街2016招聘笔试(回文串)
题目描述
给定一个字符串,问是否能通过添加一个字母将其变为回文串。
输入描述:
一行一个由小写字母构成的字符串,字符串长度小于等于10。
输出描述:
输出答案(YES\NO).
输入例子:
coco
输出例子:
题目描述
给定一个字符串,问是否能通过添加一个字母将其变为回文串。
输入描述:
一行一个由小写字母构成的字符串,字符串长度小于等于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");
}
}
}