刷题 最长回文子串 动态规划

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$ 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值