码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode#5 Longest Palindromic Substring

时间:2015-07-28 17:22:12      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

Problem Definition:

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.

Solution:

1) 暴力。把所有的子串全找出来,然后验真是否回文。找子串耗时O(n^2)来确定起点和终点;验真回文耗时O(n)。于是得到一个O(n^3)的算法(或许不叫算法)。

 1 def longestPalindrome(s):
 2         #brute-force TLE
 3         mag,subLen,maxLen,subStr=len(s),2,1,[0,1]#[begin,length]
 4         while subLen<=mag:
 5             for i in range(mag-subLen+1):
 6                 if self.isPal(s[i:i+subLen]):
 7                     maxLen=max(maxLen,subLen)
 8                     subStr=[i,maxLen]
 9             subLen+=1
10         return s[subStr[0]:subStr[0]+subStr[1]]
11 
12 def isPal(s):
13         head,rear=0,len(s)-1
14         while head<=rear:
15             if s[head]!=s[rear]:
16                 return False
17             head+=1
18             rear-=1
19         return True

 

2)动态规划。任何长度大于1的回文,必然可以由更小的回文扩展而来。用s[i....j]表示从i到j的这个子串,则有:

  1._如果s[i+1...j-1]是回文,且s[ i ]==s[ j ],则s[i...j]是回文。

  2._如果s[i+1...j-1]不是回文,或者s[ i ]!=s[ j ],则s[i...j]不是回文。

    可以用一个表来记录子串是否是回文。tb=[ n ][ n ], tb[ 2 ][ 2 ]==True表示从下标2开始到下标2结束的

  子串(就是一个字符)是回文,tb[4][7]==True表示从下标4到下标7的串是回文。

    这个解法耗时O(n^2),空间复杂度也是O(n^2)。

 1 def longestPalindrome(s):
 2         #dp
 3         begin,maxLen=0,1
 4         tb=[[False]*len(s)]*len(s)
 5         for i in range(len(s)): #subLen=1
 6             tb[i][i]=True
 7         for i in range(len(s)-1):
 8             if tb[i][i]==tb[i][i+1]:  #subLen=2
 9                 begin=i
10                 maxLen=2
11         for subLen in range(3,len(s)+1): #subLen=[3-->len(s)]
12             for i in range(len(s)-subLen+1):  #begin index
13                 j=i+subLen-1                  #end index
14                 if s[i]==s[j] and tb[i+1][j-1]==True:
15                     tb[i][j]=True
16                     begin=i
17                     maxLen=subLen
18         return s[begin:begin+maxLen]

 

3)从回文串对称轴扩展。我们知道回文字符串是对称的,因此任何一个回文字符串都可以从它的对称轴处开始扩展而来。

   这里要注意的是,回文串的长度可能是奇数或偶数。奇数长度字符串的对称轴上是一个字符,比如aba;偶数长度字

   符串对称轴上则是空隙,比如abba。因此有2n-1个位置可以作为对称轴(n个字符,n-1个空隙)。

   此方法耗时O(n^2),空间复杂度为常数。

 1 def longestPalindrome(s):
 2         lgst=s[0]
 3         for i in range(len(s)-1):
 4             s1=self.expCenter(s, i, i)
 5             if len(s1)>len(lgst):
 6                 lgst=s1
 7             s2=self.expCenter(s, i, i+1)
 8             if len(s2)>len(lgst):
 9                 lgst=s2
10         return lgst
11 
12 def expCenter(self, s, lft, rgt):
13         while lft>=0 and rgt<len(s) and s[lft]==s[rgt]:
14             lft-=1
15             rgt+=1
16         return s[lft+1:rgt]

 

4)还有更优的解法吗? Manacher算法可以达到线性的时间复杂度。

 

LeetCode#5 Longest Palindromic Substring

标签:

原文地址:http://www.cnblogs.com/acetseng/p/4683120.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!