您的位置:首页 > 编程语言

2016蘑菇街编程题:添加一个字母成为回文串

2016-03-30 20:27 387 查看

题目描述

给定一个字符串,问是否能通过添加一个字母将其变为回文串。[b]输入描述:[/b]
一行一个由小写字母构成的字符串,字符串长度小于等于10。

[b]输出描述:[/b]
输出答案(YES\NO).

[b]输入例子:[/b]
coco

[b]输出例子:[/b]
YES
解题
暴力,在所有位置添加一个字母:a-z,判断是否可以是回文串,时间复杂度是不是太长了。
下面一个半暴力
1.原字符串str和其逆序字符串revstr进行比较
2.去除两侧相等的元素,次数两个指针为lowhigh
3.lowhigh对于两个不相同的元素
4.low=str.length()说明原始字符串已经是回文串返回true
5.high-low==1说明这两个字符串不一样,并且他们中间也没有了字符串,可以通过插入其中一个字符串形成回文串
6.下面就比较复杂了
7.对str和revstr的low--high进行比较,主要分成下面两个部分比较
8.str的low--high-1部分和revstr的low+1--high部分,判断是否是回文串,是回文串,就可以添加一个字符low或者high形成回文串
9.str的low+1--high部分和revstr的low--high-1部分,同样判断是否是回文串
importjava.util.Scanner;
publicclassMain{

publicstaticvoidmain(String[]args){
Mainm=newMain();
m.run();
}
publicvoidrun(){
Scannerin=newScanner(System.in);
Stringstr;
StringrevStr;
while(in.hasNext()){
str=in.nextLine();
revStr=reverse(str);
if(isInsertPalindromic(str,revStr)){
System.out.println("YES");
}else{
System.out.println("NO");
}
}
}
publicbooleanisInsertPalindromic(Stringstr,StringrevStr){
intlow=0;
inthigh=str.length()-1;
if(low<high){
while(low<=high&&str.charAt(low)==revStr.charAt(low))
low++;
if(low==high+1)//本来就是回文串添加一个字母也可以形成回文串
returntrue;
while(low<=high&&str.charAt(high)==revStr.charAt(high))
high--;
if(high-low==1)//中间没有字母,只需增加一个就可以形成回文串
returntrue;
//这里说明两个字符串比较出现不相等的情况,
//strlow-high-1和revStrlow+1-high部分是回文串则整体就是回文串
StringstrTmp=str.substring(low,high);
StringrevTmp=revStr.substring(low+1,high+1);
if(isPalindromic(strTmp,revTmp))
returntrue;
//strlow+1-high和revStrlow-high-1部分是回文串则整体就是回文串
strTmp=str.substring(low+1,high+1);
revTmp=revStr.substring(low,high);
if(isPalindromic(strTmp,revTmp))
returntrue;

}
returnfalse;
}
publicbooleanisPalindromic(Strings1,Strings2){
if(s1.length()!=s2.length())
returnfalse;
intlow=0;
inthigh=s1.length()-1;
while(low<=high&&s1.charAt(low)==s2.charAt(low))
low++;
if(low==high+1)
returntrue;
returnfalse;
}
publicStringreverse(Stringstr){
StringrevStr="";
for(inti=str.length()-1;i>=0;i--){
revStr+=str.charAt(i);
}
returnrevStr;
}
}
讨论中看到可以通过、判断原字符串和翻转字符串的最长公共子序列长度是否比原字符串长度小1或相等
参考讨论
插入一个字符串是回文,那么,删除一个字符串也一定是回文
时间复杂度O(n^2)
importjava.util.*;
publicclassMain{
publicstaticvoidmain(String[]args){
Scannerin=newScanner(System.in);
booleanflag=true;
while(in.hasNext()){
char[]A=in.nextLine().toCharArray();
flag=true;
if(A==null||A.length<=1){
System.out.println("YES");
continue;
}
for(inti=0;i<A.length;i++){
if(isPalindromic(A,0,A.length-1,i)){
flag=false;
break;
}

}
if(flag)
System.out.println("NO");
else
System.out.println("YES");
}
}
//数组A中,去除第k位置后判断是否回文
publicstaticbooleanisPalindromic(char[]A,intleft,intright,intk){
if(left==right||left-right==-1)
returntrue;
while(left<right){
if(left==k)
left++;
if(right==k)
right--;
if(left<right&&A[left]==A[right]){
left++;
right--;
}else
returnfalse;

}
returntrue;
}
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: