**题目:**给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
**思路:**是回文子串的判断条件
- 由单个字符组成。
- 由 2 个字符组成,且字符要相同。
- 由多于 2 个字符组成,首尾字符相同,且剩余子串是一个回文串。
利用动态规划的思想,利用两层for循环将字符串从左到右分成一个个子串来判断
/**
* @param {string} s
* @return {number}
*/
// s为传入的字符串
var countSubstrings = function(s) {
let count = 0;
// 创建一个二维数组,利用数组的位置代表当前的字串的位置,用数组的内容来记录是否是回文子串
let dp = new Array(s.length);
for(let i = 0; i<s.length; i++) {
// 先统一填充为false
dp[i] = new Array(s.length).fill(false)
}
for(let i = 0; i < s.length; i++){
for(let j = 0; j <= i; j++){
// i与j相等表示当前只取了一个字符,符合条件一
if(i == j) {
dp[i][j] = true;
count++;
// i-j等于1表示当前取到了两个字符,如果相等就符合条件二
} else if(i - j == 1 && s[i] == s[j]) {
dp[i][j] = true;
count++;
/* i-j大于1表示取到的字符数量大于2,dp[i-1][j+1]用来判断当前串的子串是否是回文子串。由于我们是从小到大层层判断的,只要有一处不是回文,接下去就都是false,所以可以用dp[i-1][j+1]来判断 */
} else if(i - j > 1 && s[i] == s[j] && dp[i-1][j+1]){
dp[i][j] = true;
count++;
}
}
}
return count;
};