https://leetcode.com/problems/longest-palindromic-substring/submissions/
思路:
假设串长为N
先建立一个N*N的二维数组arr. arr[i][j] = 1 代表 s[i.....j]子串为回文串。
初始arr的值全为0;
A. arr[i][i] = 1,单个字母是回文串。
B. 若s[i]==s[i+1] , 则arr[i][i+1] =1 。因为aa , bb , cc...是回文串
设子串为fabag , 则arr
由A. B.规则,更新上图L1 L2斜线的元素。由L1的元素可以更新L3的元素。 由 L2的元素可以更新L4的元素。由L3的元素可以更新L5的元素。
更新规则:
if s[b]==s[b+a] and 1==arr[b+1][b+a-1]:
arr[b][b+a]=1
意思是:若果子串【...m......n.....】, 若果子串s[m.....n]是回文串(1==arr[m][n]), 并且s[m-1] == s[n+1] , 那么子串
【...,m-1,m......n,n+1.....】也是回文串。
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
slen = len(s)
if(slen<2):
return s
arr =[]
mi=0
mj=0
for i in range(slen-1):
arr.append([0]*slen)
arr[i][i]=1
if s[i]==s[i+1]:
arr[i][i+1]=1
if mj==0:
mi = i
mj = i+1
arr.append([0]*slen)
arr[slen-1][slen-1]=1
for i in range(slen-2):
a = i+2
for b in range(slen-a):
if s[b]==s[b+a] and 1==arr[b+1][b+a-1]:
arr[b][b+a]=1
if a>(mj-mi):
mi = b
mj = b+a
s = s[mi : (mj+1)]
return s
#self.longestPalindrome(s[(mj-arr[mi][mj]+1) : (mj+1)])
s = Solution()
print s.longestPalindrome('abcbflkdfgkkjfdssabcdedcbalkhklht')
print s.longestPalindrome("aacdefcaa")
print s.longestPalindrome("abad")
print s.longestPalindrome("abcdbbfcba")
q@ubuntu:~/Desktop$ python pyg.py
abcdedcba
aa
aba
bb
q@ubuntu:~/Desktop$