【算法学习】回文子串

117 阅读1分钟

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

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

**思路:**是回文子串的判断条件

  1. 由单个字符组成。
  2. 由 2 个字符组成,且字符要相同。
  3. 由多于 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;
};