字符串dp系列

647. 回文子串

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。

示例 1:

输入: "abc"
输出: 3
解释: 三个回文子串: "a", "b", "c".
示例 2:

输入: "aaa"
输出: 6
说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".

1.暴力,生成所有子串,一个个判断

2.dp[j][i]表示从j到i是否为回文串,如果s[j]==s[i],且dp[j+1][i-1]也是回文串,那么dp[j][i]为真

class Solution:
    def countSubstrings(self, s: str) -> int:
        res=[]
        for i in range(len(s)):
            for j in range(i,len(s)):
                res.append(s[i:j+1])
        def func(s):
            for i in range(len(s)//2):
                if s[i]!=s[len(s)-1-i]:return False
            return True
        ans=0
        for r in res:
            if func(r):ans+=1
        return ans

class Solution(object):
    def countSubstrings(self, s):
        if not s:return 1
        length = len(s)
        dp =[[0]*length for _ in range(length)]
        res = 0
        for j in range(0,length):
            for i in range(0,j+1):
                if (s[i] == s[j] and ((j-i<=2) or dp[i+1][j-1])):
                    dp[i][j] = 1
                    res += 1
        return res 
                    

5. 最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
1.输出: "bb"

1.dp[j][i]表示从j到i是否为回文串,如果s[j]==s[i],且dp[j+1][i-1]也是回文串,那么dp[j][i]为真

2.中心扩展

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n=len(s)
        dp=[[0]*n for _ in range(n)]
        res=""
        for i in range(n):
            for j in range(i+1):
                if s[i]==s[j] and (i-j+1<=3 or dp[j+1][i-1]):
                    dp[j][i]=1
                    res=max(res,s[j:i+1],key=len)
        return res

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n=len(s)
        self.res=""
        def helper(i,j):
            while i>=0 and j

 

你可能感兴趣的:(Leetcode)