📌  相关文章
📜  教资会网络 | UGC NET CS 2016 年 8 月 – III |问题 14(1)

📅  最后修改于: 2023-12-03 15:26:04.005000             🧑  作者: Mango

UGC NET CS 2016年8月-III | 问题14

题目描述

给定一个字符串,编写一个算法以确定它包含多少个“回文子字符串”。

示例
输入: "abc"
输出: 3
解释:这个字符串中的 3 个回文子字符串分别是 "a", "b" 和 "c"。

输入: "aaa"
输出: 6
解释:这个字符串中的 6 个回文子字符串分别是 "a", "a", "a", "aa", "aa" 和 "aaa"。
算法

我们可以使用中心扩展算法来解决这个问题。对于每个字符,我们向左右两个方向扩展,以找到所有可能的回文子字符串。由于回文子字符串可以是奇数或偶数,因此我们需要考虑两种情况。

代码
def count_palindromic_substrings(s: str) -> int:
    count = 0
        
    for i in range(len(s)):
        # 奇数长度的回文子字符串
        l, r = i, i
        while l >= 0 and r < len(s) and s[l] == s[r]:
            count += 1
            l -= 1
            r += 1
            
        # 偶数长度的回文子字符串
        l, r = i, i + 1
        while l >= 0 and r < len(s) and s[l] == s[r]:
            count += 1
            l -= 1
            r += 1
    
    return count
复杂度分析
  • 时间复杂度:$O(n^2)$,其中 $n$ 是字符串的长度。对于每个字符,我们最多向左右两个方向扩展 $n/2$ 次。
  • 空间复杂度:$O(1)$。我们只需要常量级别的空间来存储变量。