算法专题训练(3)回文字符串

136 篇文章 0 订阅
33 篇文章 0 订阅
这篇博客探讨了如何解决与回文字符串相关的算法问题,包括516题——求字符串中最大回文子串的最大长度,以及5.题——求最长回文子串。博主介绍了不同的解题思路,如利用翻转字符串找到最长公共子序列,以及使用动态规划的方法。此外,还提及了647题,关于计算字符串中回文子字符串的总数,并列出了未来要解决的730题——计数不同的回文子序列。
摘要由CSDN通过智能技术生成

将s翻转成s1 求s和s1的最长公共子序列长度
可以先判断下s是否是回文
另外一个思路
dp[i][j] = dp[i + 1][j - 1] + 2 if s[i] == s[j]
dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]) otherwise

class Solution(object):
    def longestPalindromeSubseq(self, s):
        """
        :type s: str
        :rtype: int
        """
        size = len(s)
        s1 = s[::-1]
        if s1 == s: return size
        dp = [[0]*(size+1) for i in range(size+1)]
        for i in range(size):
            for j in range(size):
                if s[i]==s1[j]: 
                    dp[i+1][j+1] = dp[i][j]+1
                else:
                    dp[i+1][j+1] = max(dp[i][j+1],dp[i+1][j])
        return dp[size][size]

在每个字符的两边都插入一个特殊的符号’#’
定义 id 为已知的 {右边界最大} 的回文子串的中心,mx则为id+P[id],也就是这个子串的右边界

class Solution(object):
    def longestPalindrome(self,s):
        '''
        :param s: str
        :return: str
        '''
        ss = '$';idx=0;mx=0
        for i in s:
            ss = ss+'#'+i
        ss = ss+'#'
        P = [0 for i in range(len(ss))]
        for i in range(1,len(ss)):
            if P[idx]+idx<i:
                P[i] = 1
            else:
                P[i] = min(P[2*idx-i],P[idx]+idx-i) #对称点
            while(i+P[i]<len(ss) and ss[i-P[i]]==ss[i+P[i]]):
                P[i] = P[i]+1
            if idx + P[idx] < i + P[i]:
                idx = i
            if P[i]>P[mx]:
                mx = i
        a = ss[mx - (P[mx] - 1):mx + P[mx]]
        ret = ''
        for i in a:
            if i!='#':
                ret+=i
        return ret

判断s[i:j+1]是否是回文等价于判断s[i+1:j] 和 s[i][j]的情况

class Solution(object):
    def countSubstrings(self, s):
        """
        :type s: str
        :rtype: int
        """
        if s=='': return 0
        size = len(s)
        dp = [[0 for i in range(size)] for j in range(size)]
        ret = 0
        for i in range(size):
            dp[i][i]=1
            for j in range(i):
                if s[i]==s[j]:
                    if dp[i-1][j+1] or j==i-1:
                        dp[i][j] = 1
            ret += sum(dp[i])
        return ret

To do list
- 730. Count Different Palindromic Subsequences, Hard

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值