最长回文串
来源:互联网 发布:淘宝优惠券转换手机端 编辑:程序博客网 时间:2024/06/11 05:36
题目
回文串是指给定一个字符串,字符串的第一个字符等于最后一个字符,第n个字符等于倒数第n个字符,比如”a”, “aa”, “aba”, “abba”都是回文串。现在给定一个字符串,返回其中最长的回文子串,如果有多个一样长的子字符串,则返回第一个。
测试样例1:输入是”a”, 程序输出”a”;
测试样例2:输入是”abc”, 程序输出”a”;
测试样例3:输入是” 121abcbad”, 程序输出” abcba”;
分析
中心扩展算法:回文字符串是以中心轴对称的,所以如果我们从下标 i 出发,用2个指针向 i 的两边扩展判断是否相等,那么只需要对0到
n-1的下标都做此操作,就可以求出最长的回文子串。但需要注意的是,回文字符串有奇偶对称之分,即”abcba”与”abba”2种类型,
因此需要在代码编写时都做判断。 时间复杂度
Manacher算法:时间复杂度O(n),参考http://blog.sina.com.cn/s/blog_3fe961ae0101iwc2.html
代码
/** * @author ShaoCheng * 中心扩展算法 */public class Main { public String longestPalindrome(String s) { String ret = ""; for (int i = 0; i < s.length(); i++) { //遍历 for(int j = 0; j <= i && i+j < s.length(); j++){ //第一次 if(s.charAt(i - j) == s.charAt(i + j)){ //按奇数对称遍历 if(ret.length() < 2*j + 1) ret = s.substring(i-j, i+j+1); } else break; } for(int j = 0; j <= i && i+j+1 < s.length(); j++){ //第二次 if(s.charAt(i-j) == s.charAt(i+j+1)){ //按偶数对称遍历 if(ret.length() < 2*j + 2) ret = s.substring(i-j, i+j+2); } else break; } } return ret; } public static void main(String[] args) { Main a = new Main(); //测试用例1 String s1 = "a"; System.out.println(a.longestPalindrome(s1)); //测试用例2 String s2 = "abc"; System.out.println(a.longestPalindrome(s2)); //测试用例3 String s3 = "121abcbad"; System.out.println(a.longestPalindrome(s3)); //测试用例4 String s4 = "bb"; System.out.println(a.longestPalindrome(s4)); //测试用例5 String s5 = "cbbc"; System.out.println(a.longestPalindrome(s5)); }}
0 0
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文子串
- 最长回文串模版
- 最长回文子串
- 最长回文子串
- A Bug's Life
- block与函数
- 安卓(android)生命周期的系统性总结以及实例演示
- Java设计模式之代理模式
- 国庆上课记录
- 最长回文串
- NYOJ 847 S+T
- 变量的scope
- Hadoop1.2.0在MAC下伪分布安装
- [摘要]Effective Objective-C 2.0(三 )
- 弱校联盟 2015-10-1 E
- Robotium 介绍
- zeromq源码分析–TCP连接处理流程
- java获取当前的系统