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; } }
相关文章推荐
- phpcms学习笔记
- java对象表示方式--XStream
- Codeforces--368C--Sereja and Algorithm(规律)
- 【poj 1159】Palindrome 题意&题解&代码(C++)
- delphi 文件的读取(二进制文件和文本文件)
- 结对编程项目---四则运算(截图,总结)
- 单元测试代码0330
- delphi中用代码实现注册Ocx和Dll(有点怪异,使用CallWindowProc来调用指定函数DllRegisterServer)
- 0330复利计算java版
- 106 miles to Chicago---zoj2797(最短路问题,求概率,模板)
- 关于C和c++中的文件结构
- 模拟抽奖的九宫格动画效果
- Go语言学习六:指针与传递到函数的指针
- java 基础拾遗
- c++函数重载
- matlab 结构体struct
- java collection接口笔记
- 单元测试代码
- Github安装失败主要是因为.net framework 4.0安装失败
- delphi 控件大全(确实很全)