Palindrome问题常见的方法有:

  • DP: 二维dp[start][len]记录每个子串是否是palindrome
  • 扩展法:从一个letter开始左右扩展

DP:

var countSubstrings = function(s) {
    const len = s.length;
    if (len === 0) {
        return 0;
    }
    if (len === 1) {
        return 1;
    }
    const dp = new Array(len);
    for (let i = 0; i< len; i++) {
        dp[i] = new Array(len);
        for (let j = 0; j < len; j++) {
            dp[i][j] = false;
        }
    }

    let res = 0;
    for (let i = 0; i < len; i++) {
        dp[i][0] = true;
        res++;
    }
    for (let i = 0; i < len-1; i++) {
        if (s[i] === s[i+1]) {
            dp[i][1] = true;
            res++;
        }
    }
    for (let gap = 2; gap < len; gap++) {
        for (let i = 0; i+gap < len; i++) {
            if (s[i] === s[i+gap] && dp[i+1][gap-2]) {
                dp[i][gap] = true;
                res++;
            }
        }
    }
    return res;
};

扩展法:

var countSubstrings = function(s) {
    const len = s.length;
    if (len === 0) {
        return 0;
    }
    if (len === 1) {
        return 1;
    }
    let res = 0;
    for (let i = 0; i < len; i++) {
        res += extend(s, i, i);
        res += extend(s, i, i+1);
    }
    return res;
};

function extend(s, left, right) {
    const len = s.length;
    let count = 0;
    while (left >= 0 && right < len) {
        if (s[left] === s[right]) {
            count++;
            left--;
            right++;
        } else {
            break;
        }
    }
    return count;
}

results matching ""

    No results matching ""