题目描述:回文字符串是指一个字符串从左到右与从右到左遍历得到的序列是相同的。例如“abcba“就是回文字符串,而"abcab"则不是回文字符串。
分析与解答:
最容易想到的方法为遍历字符串所有可能的子串(暴力法),判断其是否为回文字符串看,然后找出最长的回文字串。但是当字符串很长的时候,这种方法的效率是非常低下的,因此这种方法不可取。
给定字符串"",假设p(i, j)=1表示“”是回文字符串;P(i, j)=0表示“”不是回文字符串;
如果:那么P(i, i+1)=1,否则P(i, i+1) =0.
如过:那么P(i+1, j+1)=p(i, j).
class Test:
def __new__(self):
self.startIndex = None
self.lens = None
def getStartIndex(self):
return self.startIndex
def getLen(self):
return self.lens
# 找出字符串中的最长的回文子串
def getLongestPalindrome(self,strs):
if strs == None:
return
n = len(str)
if n < 1:
return
self.startIndex = 0
self.lens = 1
# 申请额外的存储空间记录查找的历史信息
historyRecord = [([None]*n) for i in range(n)]
i = 0
while i < n:
j = 0
while i < n:
historyRecord[i][j] = 0
j += 1
i += 1
# 初始化长度为1的回文字符串信息
i = 0
while i < n:
historyRecord[i][i] = 1
i += 1
# 初始化长度为2的回文字符串信息
i = 0
while i < n-1:
if list(strs)[i] == list(strs)[i+1]:
historyRecord[i][i+1] = 1
self.startIndex = i
self.lens = 2
i += 1
# 查找从长度为3开始的回文字符串
plen = 3
while plen <= n:
i = 0
while i < n - plen + 1:
j = i + plen - 1
if list(strs)[i] == list(strs)[j] and historyRecord[i + 1][j -1 ] == 1:
historyRecord[i][j] = 1
self.startIndex = i
self.lens = plen
i += 1
plen += 1