提取最长回文子串的java实现
2014-05-09 22:02
357 查看
题目描述
给定一个字符串,找出该字符串的最长回文子串。回文字符串指的就是从左右两边看都一样的字符串,如aba,cddc都是回文字符串。字符串abbacdc存在的回文子串有abba和cdc,因此它的最长回文子串为abba。中心法求最长回文子串
还有一个更简单的方法可以使用O(N^2)时间、不需要额外的空间求最长回文子串。我们知道回文字符串是以字符串中心对称的,如abba以及aba等。一个更好的办法是从中间开始判断,因为回文字符串以字符串中心对称。一个长度为N的字符串可能的对称中心有2N-1个,至于这里为什么是2N-1而不是N个,是因为可能对称的点可能是两个字符之间,比如abba的对称点就是第一个字母b和第二个字母b的中间。因此可以依次对2N-1个中心点进行判断,求出最长的回文字符串即可。根据该思路可以写出下面的代码。package edu.pku.ss.hlj; public class LongestPalindrome { public static void main(String[] args) { String str = "abcddcc"; String result = getPalindrome(str); System.out.println(result); } /** * 判断一个字符数组从某一个或两个点开始向两端拓展,是否是回文串,是则返回该子串 * * @param ch * @param i * @param j * @return */ public static String getEvery(char[] ch, int i, int j) { int length = ch.length; while (i >= 0 && j <= length - 1 && ch[i] == ch[j]) { i--; j++; } return String.valueOf(ch).substring(i + 1, j);// 不可以用ch.toString(),这个方法返回的不是字符数组对应的字符串,而是一个内存地址, // 且此处无论是前面边界退出还是两端值不等退出都应该将ij的值回退,所以sub这两端。 } /** * 遍历原数组,提取出最长的回文子串 * * @param s * @return */ public static String getPalindrome(String s) { char[] ch = s.toCharArray(); String str = " "; String re = ""; for (int i = 0; i < ch.length; i++) { re = getEvery(ch, i, i); // 当以一个字符为中轴也就是回文串为奇数时 if (re.length() > str.length()) { str = re; } re = getEvery(ch, i, i + 1); // 当以当前和他后一个字符为轴心,也就是回文串为偶数时 if (re.length() > str.length()) { str = re; } } return str; } }
相关文章推荐
- 求最长回文子串_Manacher算法_Java实现
- java 实现后缀数组及最长回文子串问题
- Java 实现求最长回文子串
- 【LeetCode-面试算法经典-Java实现】【005-Longest Palindromic Substring(最长回文子串)】
- 给出两个字符串,找到最长公共子串,并返回其长度,java实现
- Java实现-最长公共子串
- python实现求最长回文子串长度
- LCS/最长公共子序列/最长公共子串 实现 Python/Java
- Java实现从文本中查找最长的回文字符串
- Manacher算法实现求最长回文子串的长度
- JAVA:返回字符串中最长回文子串的长度
- 寻找字符串中最长回文——Manacher算法及其Java实现
- 初步实现最长回文子串
- 提取最长回文子串
- java实现获取输入字符串内最长数字子串
- “最长上升子序列,最大连续子序列和,最长公共子串”的Java实现
- java实现求两个字符串最长公共子串的方法
- Java实现-最长无重复字符的子串
- 输出最长子串 Java实现
- 最长回文子串(manacher算法实现)