描述:Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
给一个String串,求其中最大的回文字串.这是一个典型的最长回文子串问题,目前有四种解法.
1.暴力测试,测试每个子串,显然这样是最笨的方法,时间复杂度O(n^3)
2.动态规划,可以参考http://blog.163.com/zhaohai_1988/blog/static/2095100852012716105847112/和http://www.cnblogs.com/en-heng/p/3973679.html
3.中心扩展法,这也是我看到题目之后最先想到的,以一个元素为中心,分别向前和向后扩展,看是否相同,要考虑abcba形式 abccba形式这两种不同的回文子串形式,时间复杂度显然是O(n^2).
1 public static String matchChar(String s,int l,int r){ //匹配以l和r为下标的字符是否相同 2 int left=l; 3 int right=r; 4 while(left<=right&&left>=0&&right<s.length()&&s.charAt(left)==s.charAt(right)){ 5 left--; 6 right++; 7 } 8 return s.substring(left+1,right); 9 } 10 public String longestPalindrome(String s) { 11 int n=s.length(); 12 if(0==n) return ""; 13 String longestString=s.substring(0,1);//一个字符 14 for(int i=0;i<n-1;i++){ 15 String tempString1=matchChar(s, i, i); //abcba形式 16 if(tempString1.length()>longestString.length()) 17 longestString=tempString1; 18 String tempString2=matchChar(s,i,i+1); //abccba形式 19 if(tempString2.length()>longestString.length()) 20 longestString=tempString2; 21 } 22 return longestString; 23 }
4.传说中的Manacher算法,时间复杂度O(n),也是比较难以理解的算法.看了好几篇博客,想要了解可以参考
http://blog.csdn.net/ggggiqnypgjg/article/details/6645824
http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html