647.Palindromic Substrings(动态规划)

本文介绍了一种高效算法来计算给定字符串中所有回文子串的数量,并使用中心扩张法进行实现。通过两个指针从每个可能的回文中心出发,向两边扩展,检查是否形成回文结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a string, your task is to count how many palindromic substrings in this string.

The substrings with different start indexes or end indexes are counted as different substrings even they consist of same characters.

Example 1:

Input: "abc"
Output: 3
Explanation: Three palindromic strings: "a", "b", "c".

Example 2:

Input: "aaa"
Output: 6
Explanation: Six palindromic strings: "a", "a", "a", "aa", "aa", "aaa".

题目的意思就是找到所给字符串中所有的回环序列个数,首先明确的是需要有两个指针,若从头开始遍历,时间复杂度为n(o^2),所以考虑动态规划,采用中心扩张的方法,长度为n的字符串有2*n-1个回环中心,将回环中心依次编号,设立left和right两个指针,从回环中心开始,依次向外扩张,若s[left]==s[right]且left和right在0到n的范围内咋回环个数加一并继续向外扩张,直到不满足条件,难点在于初始指针的确定。

如果回环中心在第i个字符上,则,left=right=i,此时回环中心为2*i,若回环中心在字符i,j之间,left=i,right=i+1,回环中心为2*i+1,所以当回环中心在center(第center个回环中心)时left=center/2,而right=center/2+center%2

故代码如下

def countSubstrings(self, S):
    N = len(S)
    ans = 0
    for center in xrange(2*N - 1):
        left = center / 2
        right = left + center %2
        while left >= 0and right <N and S[left] == S[right]:
            ans += 1
            left -=1
            right +=1
    return ans


练习:413


    ### 动态规划算法基本原理 动态规划是一种解决多阶段决策过程最优化问题的方法。它通过把原问题分解成相对简单的子问题的方式求解复杂问题。这种方法的核心在于存储已经计算过的中间状态的结果,从而避免重复计算。 #### 子问题重叠特性 动态规划依赖于子问题的重叠性质。这意味着一个问题可以被划分为多个更小的子问题,并且这些子问题会被多次调用[^3]。为了提高效率,动态规划会保存每一个子问题的解决方案,通常使用表格或者数组来记录这些结果。 #### 最优子结构 另一个重要的概念是最优子结构性质,即如果一个问题的最优解包含了其子问题的最优解,则该问题具有最优子结构属性。这一特点使得我们可以自底向上构建整个问题的最佳解答方案。 以下是基于上述理论的一个简单例子——寻找字符串中的最长回文子串: ```python def longest_palindromic_substring(s): n = len(s) if n == 0: return "" start, max_length = 0, 1 dp = [[False]*n for _ in range(n)] # Every single character is a palindrome of length 1. for i in range(n): dp[i][i] = True # Check substrings of length 2 to n. for end in range(1, n): for begin in range(end): if s[begin] == s[end]: if (end - begin <= 2 or dp[begin+1][end-1]): dp[begin][end] = True current_len = end - begin + 1 if current_len > max_length: max_length = current_len start = begin return s[start:start + max_length] print(longest_palindromic_substring("babad")) ``` 此代码片段展示了如何应用动态规划方法找到给定字符串内的最长回文子串[^2]。 #### 实现步骤概述 尽管这里不采用逐步描述方式,但仍需提及几个关键环节:定义状态转移方程、初始化边界条件以及最终结果提取逻辑。
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值