动态规划 判断回文串

100 阅读1分钟

题目

给定字符串判断是否为回文串

  • 范围尝试模型:判断[i,j]范围是否为回文串,dp[i][j], i、j为字符串 [i,j] 范围是否为子串
    • 当区间长度为1时,一定是回文
    • 当区间长度为2时,如果两个字符相等为回文
    • 其余情况,如果 str[i] === str[j] ,则判断 dp[i+1][j-1] 是否为回文串

259edb4830e5dde7aa540a46235fe5dc.png

function main(str) {
  let dp = [];
  setDp(str, dp);

  // 验证 left 到 right 是否回文
  function setDp(str, dp) {
    // 填充对角线和上面第二条对角线
    for (let i = 0; i < str.length - 1; i++) {
      dp[i][i] = true;
      dp[i][i + 1] = str[i] === str[i + 1];
    }

    // 填充第二条对角线往上的区域
    for (let row = str.length - 3; row >= 0; row++) {
      for (let col = row + 2; col < str.length; col++) {
        // 如果 i、j位置相等才判断 [i+1,j-1]范围是否为回文
        if (str[row] === str[col]) {
          dp[row][col] = dp[row + 1][col - 1];
        } else {
          dp[row][col] = false;
        }
      }
    }
  }
  
  return dp[0][str.length-1]
}