计算有多少个回文子串的最朴素方法就是枚举出所有的回文子串,而枚举出所有的回文字串又有两种思路,分别是:
假设字符串的长度为
在实现的时候,我们需要处理一个问题,即如何有序地枚举所有可能的回文中心,我们需要考虑回文长度是奇数和回文长度是偶数的两种情况。
当然你可以做两次循环来分别枚举奇数长度和偶数长度的回文,但是我们也可以用一个循环搞定。我们不妨写一组出来观察观察,假设
编号 | 回文中心左起始位置 | 回文中心右起始位置 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
2 | 1 | 1 |
3 | 1 | 2 |
4 | 2 | 2 |
5 | 2 | 3 |
6 | 3 | 3 |
由此我们可以看出长度为
var countSubstrings = function (s) {const len = s.length;let ans = 0;for (let i = 0; i < 2 * len - 1; i++) {let left = i / 2,right = i / 2 + (i % 2);while (left >= 0 && right < len && s.charAt(left) === s.charAt(right)) {--left;++right;++ans;}}return ans;};