题目描述
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
示例
输入: "abc"
输出: 3
解释: 三个回文子串: "a", "b", "c".
输入: "aaa"
输出: 6
说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".
解法
我们可以枚举每个子串,然后判断是否是回文串。但这样时间复杂度为 ,无法通过此题。
考虑到回文串的特点,可以从字符串的某一位置开始向两边扩展,判断扩展出来的子串是否为回文串。具体实现时,我们可以分别以每个字符为中心,向左右两边扩展,统计回文串数量即可。需要注意奇数长度和偶数长度的回文串。
代码实现
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;
}
复杂度分析
该算法时间复杂度为 ,空间复杂度为 。因为我们每个字符最多只会向两边扩展,所以时间复杂度为 ,空间复杂度为 。