题目

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

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

示例 1:

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

示例 2:

输入:”aaa”
输出:6
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”

提示:

输入的字符串长度不会超过 1000 。

题解思路

只需要注意一点:具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串

回文子串说的通俗易懂一点,其实就是,正着读和反着读是一样的,比如“aba”,就一共是4个回文子串。

解题思路就是遍历两边字符串,第一遍的时候,既然每个字母都可以是单独的子串,那么,第一次遍历的时候,有几个字母就加几。第二次遍历,需要将当前字母跟后面的字母进行比较,如果遇到相同的字母,还需要进一步判断,正着读跟反着读是不是一样。是的话,子串数量加一。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @param {string} s
* @return {number}
*/
var countSubstrings = function(s) {
if (!s) return 0;
const sArr = s.split(''); // 字符串转数组
let count = 0; // 子串的总数量
for (let i = 0; i < s.length; i ++) {
count ++; // 第一次遍历每个字母都是单独的子串,都加一
for (let j = i + 1; j < s.length; j ++) {
if (sArr[i] === sArr[j]) {// 第二次遍历首要要求就是前后 两个字母相同
if (s.substring(i, j + 1) === s.substring(i, j + 1).split('').reverse().join('')) { // 字母相同是首要,还需要正反都相同
count ++; // 满足正反相同继续加一
}
}
}
}
return count;
};