Longest Palindromic Substring(medium 常考)

来源:互联网 发布:湖南大学网络教学平台 编辑:程序博客网 时间:2024/06/07 01:02

【题目】 

       Given a string S, find the longest palindromic substring inS. You may assume that the maximum length ofS is 1000, and there exists one unique longest palindromic substring.

【题意】 

     求出字符串中最长回文

【分析】 

     有两种方法。 第一种方法的思路是对于每个子串的中心(可以是一个字符,或者是两个字符的间隙,比如串abc,中心可以是a,b,c,或者是ab的间隙,bc的间隙)往两边同时进行扫描,直到不是回文串为止。假设字符串的长度为n,那么中心的个数为2*n-1(字符作为中心有n个,间隙有n-1个)。对于每个中心往两边扫描的复杂度为O(n),所以时间复杂度为O((2*n-1)*n)=O(n^2),空间复杂度为O(1),

实现

   

public class Solution {    public String longestPalindrome(String s) {  if(s == null || s.length()==0)    return "";  int longest = 0;  String res = "";  for(int i=0;i<2*s.length()-1;i++)  {    int left = i/2;    int right = i/2;    if(i%2==1)      right++;    String str = lengthOfPalindrome(s,left,right);    if(longest<str.length())    {      longest = str.length();      res = str;    }  }  return res;}private String lengthOfPalindrome(String s, int left, int right){    while(left>=0 && right<s.length() && s.charAt(left)==s.charAt(right))  {    left--;    right++;  }  return s.substring(left+1,right);}}

动态规划的想法:

   诀窍就是避免重复计算(即重复检测同一子串)。考虑这个例子”ababa”。如果我们已经检测过”bab”是回文,那么只需判断一下最左右的两个字符(即两个a)是否相同即可判定”ababa”是否回文了。

  外层循环i从后往前扫,内层循环j从i当前字符扫到结尾处。过程中使用的历史信息是从i+1到n之间的任意子串是否是回文已经被记录下来,所以不用重新判断,只需要比较一下头尾字符即可。这种方法使用两层循环,时间复杂度是O(n^2)。而空间上因为需要记录任意子串是否为回文,需要O(n^2)的空间,

public String longestPalindrome(String s) {  if(s == null || s.length()==0)    return "";  boolean[][] palin = new boolean[s.length()][s.length()];  String res = "";  int maxLen = 0;  for(int i=s.length()-1;i>=0;i--)  {    for(int j=i;j<s.length();j++)    {      if(s.charAt(i)==s.charAt(j) && (j-i<=2 || palin[i+1][j-1]))      {        palin[i][j] = true;        if(maxLen<j-i+1)        {          maxLen=j-i+1;          res = s.substring(i,j+1);        }      }    }  }  return res;}


综上所述,两种方法的时间复杂度都是O(n^2),只是第一种方法的常数会大一些。而空间上来看第一种方法是常量的,比第二种方法优。这个题目中假设最长回文子串只有一个,实际面试中一般不做这种假设,如果要返回所有最长回文串,只需要稍做变化就可以,维护一个集合,如果等于当前最大的,即加入集合,否则,如果更长,则清空集合,加入当前这个。实际面试会有各种变体,感觉平常还是要多想才行。

http://my.oschina.net/jdflyfly/blog/283470
0 0
原创粉丝点击