LeetCode热题(JS版) - 647. 回文子串

172 阅读1分钟

题目描述

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

示例

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

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

解法

我们可以枚举每个子串,然后判断是否是回文串。但这样时间复杂度为 O(n3)O(n^3),无法通过此题。

考虑到回文串的特点,可以从字符串的某一位置开始向两边扩展,判断扩展出来的子串是否为回文串。具体实现时,我们可以分别以每个字符为中心,向左右两边扩展,统计回文串数量即可。需要注意奇数长度和偶数长度的回文串。

代码实现

function countSubstrings(s: string): number {
  let res = 0;
  for (let i = 0; i < s.length; i++) {
    // 奇数长度回文串
    let l = i, r = i;
    while (l >= 0 && r < s.length && s[l] === s[r]) {
      res++;
      l--;
      r++;
    }
    // 偶数长度回文串
    l = i;
    r = i + 1;
    while (l >= 0 && r < s.length && s[l] === s[r]) {
      res++;
      l--;
      r++;
    }
  }
  return res;
}

复杂度分析

该算法时间复杂度为 O(n2)O(n^2),空间复杂度为 O(1)O(1)。因为我们每个字符最多只会向两边扩展,所以时间复杂度为 O(n2)O(n^2),空间复杂度为 O(1)O(1)