"如何求字符串里的最长回文子串"(python)

题目描述:回文字符串是指一个字符串从左到右与从右到左遍历得到的序列是相同的。例如“abcba“就是回文字符串,而"abcab"则不是回文字符串。

分析与解答:

最容易想到的方法为遍历字符串所有可能的子串(暴力法),判断其是否为回文字符串看,然后找出最长的回文字串。但是当字符串很长的时候,这种方法的效率是非常低下的,因此这种方法不可取。

给定字符串"s_{0} s_{1}s_{2}...s_{n}",假设p(i, j)=1表示“s_{i}s_{i+1}...s_{j}”是回文字符串;P(i, j)=0表示“s_{i}s_{i+1}...s_{j}”不是回文字符串;

如果s_{i} == s_{i+1}:那么P(i, i+1)=1,否则P(i, i+1) =0.

如过s_{i+1} == s_{j +1}:那么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

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值