首页 > 其他分享 >[leetcode]647_回文子串

[leetcode]647_回文子串

时间:2024-09-29 18:55:16浏览次数:3  
标签:子串 res length 647 字符串 leetcode dp 回文

给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。

示例 1:
输入:s = "abc"
输出:3
解释:三个回文子串: "a", "b", "c"
示例 2:
输入:s = "aaa"
输出:6
解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
提示:
1 <= s.length <= 1000
s 由小写英文字母组成

解题思路:【双指针】

从某一个字符、或者某两个字符展开,向左右两边判断回文串

如:s = 'ababaab'

单个字符s[3]: a b a b a a b,两个方向长度一直为奇数个

两个字符s[3]、s[4]:a b a b a a b,两个方向长度一直为偶数个


class Solution:
    def extend(self, s, left, right, length):  # 输出每个回文字符串、和对应长度
        res = 0
        while left >= 0 and right < length and s[left] == s[right]:
            left -= 1
            right += 1
            res += 1
        return res
    def judge_sub_palindrome(self,s):
        res = 0
        for i in range(len(s)):
            res += self.extend(s, i, i, len(s))
            res += self.extend(s, i, i + 1, len(s))
        return res
if __name__ == '__main__':
    s = input()
    result = Solution().judge_sub_palindrome(s)
    print(result)

其他思路:【动态规划】

    dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。

    当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况
    情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串
    情况二:下标i 与 j相差为1,例如aa,也是回文子串
    情况三:下标:i 与 j相差大于1的时候,
        例如cabac,此时s[i]与s[j]已经相同了,
        我们看i到j区间是不是回文子串就看aba是不是回文就可以了,
        那么aba的区间就是 i+1 与 j-1区间,
        这个区间是不是回文就看dp[i + 1][j - 1]是否为true。

    dp[i][j]初始化为false。

    def sub_palindrome(self, s):
        res = 0
        length = len(s)
        dp = [[False] * length for _ in range(length)]
        for i in range(length - 1, -1, -1):
            for j in range(i, length):
                if s[i] == s[j]:
                    if j - i <= 1:
                        res += 1
                        dp[i][j] = True
                    elif dp[i + 1][j - 1]:
                        res += 1
                        dp[i][j] = True
        return res

仅作为代码记录,方便自学自查自纠

标签:子串,res,length,647,字符串,leetcode,dp,回文
From: https://blog.csdn.net/weixin_45653183/article/details/142586865

相关文章

  • [leetcode]516_最长回文子序列
    给你一个字符串s,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。示例1:输入:s="bbbab"输出:4解释:一个可能的最长回文子序列为"bbbb"。示例2:输入:s="cbbd"输出:2解释:一个......
  • [leetcode]53_最大子数组(序列)和
    给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入:[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1]的和最大,为6。示例2:输入:nums=[1]输出:1示例3:输入:nums=[5,4,-1,7,8]输出:23提示:1<=......
  • 【LeetCode Hot 100】22. 括号生成
    题目描述要求生成所有“合法”的括号字符串,就首先需要弄清楚括号字符串的合法性定义,也就是说如果我们现在有一个由小括号组成的字符串,该如何判断其是否符合要求。此前做过判断括号串是否合法的题目,那道题目中一般在遍历过程中维护一个栈,因为每个后括号都需要在已经遍历的子串中找......
  • Leetcode 887. 鸡蛋掉落
    1.题目基本信息1.1.题目描述给你k枚相同的鸡蛋,并可以使用一栋从第1层到第n层共有n层楼的建筑。已知存在楼层f,满足0<=f<=n,任何从高于f的楼层落下的鸡蛋都会碎,从f楼层或比它低的楼层落下的鸡蛋都不会破。每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层......
  • (nice!!!)LeetCode 2286. 以组为单位订音乐会的门票(线段树)
    题目:2286.以组为单位订音乐会的门票思路:线段树做法。(线段树)acwing1265.数星星classBookMyShow{public: //结构体typedefstructNode{intmn=0;//最小空位编号longlongsum=0;//非空位置之和}node; //n,mintN,M;......
  • leetcode74 搜索二维矩阵
    leetcode74搜索二维矩阵思路可以使用二叉搜索,首先先看标准的闭区间二叉搜索代码publicintqSearch(int[]a,intl,intr,inttarget){intmid=(l+r)/2;if(l>r)returnl;//终止条件,区间为空if(a[mid]==target)returnmid;elseif(a[mid]<target)retur......
  • Leetcode 1235. 规划兼职工作
    1.题目基本信息1.1.题目描述你打算利用空闲时间来做兼职工作赚些零花钱。这里有n份兼职工作,每份工作预计从startTime[i]开始到endTime[i]结束,报酬为profit[i]。给你一份兼职工作表,包含开始时间startTime,结束时间endTime和预计报酬profit三个数组,请你计算并返回可......
  • Leetcode面试经典150题-64.最小路径和
    给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例1:输入:grid=[[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径1→3→1→1→1的总和最小。示例2:输入:grid=[[1......
  • LeetCode--Dota2 参议院(day 2)
     今天给大家带来LeetCode中的一道算法题:参议院问题,忘记具体内容的朋友可以观看下图: 根据题意,我们可以清楚的认识到获胜条件:那就是字符串中仅包含D或R。 我们先以RDRDD为例进行说明: 字符串中的第一个R行使权力,淘汰D阵营中的某一位,我们可以看见字符串中有三个D,那么该......
  • leetCode--爬楼梯(记录做题过程加深印象)
    首先最广泛的方法为递归,直接上代码:intclimbStairs(intn){if(n==1){return1;}if(n==2){return2;}if(flag[n])returnflag[n];returnflag[n]=climbStairs(n-1)+climbStair......