69. 最长回文子串

作者: wo不是黄蓉 | 来源:发表于2022-03-01 22:01 被阅读0次

day16: 5. 最长回文子串
(中等)

  • 依旧暴力解法,没有通过所有的测试用例
  • 中心扩散法:前面示例的慢的主要原因在于需要列举每种字符串组合的出现情况,循环次数等于(i*(i-1)/2)次,而下面的循环次数等于i次。
    使用中心扩散法,利用回文字串的特性,s[0]和s[n-1]位置的字符应该相同,不相同则判定不是回文字符串。
/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function (s) {
  if (s.length == 1) return s;
  let max = 0,
    res = 0;
  let i = 0,
    j = 0;
  //遍历s,
  for (; i < s.length + 1; i++) {
    for (; j < s.length + 1; j++) {
      //截取i-j之间的元素
      if (j > i) {
        let temp = s.substring(i, j);
        //判断字符串是否是回文子串
        if (isPalind(temp)) {
          // max = Math.max(max, j - i);
          if (max < j - i) {
            max = j - i;
            res = i;
          }
        }
      }
    }
    j = 0;
  }
  console.log(i, j, max, res);
  return s.substring(res, res + max);
};

function isPalind(str) {
  //双指针
  str = [...str];
  let start = 0,
    end = str.length - 1;
  for (let i = 0; i < str.length - 1; i++) {
    while (start < end) {
      if (str[start] !== str[end]) {
        return false;
      } else {
        start++;
        end--;
      }
    }
  }
  return true;
}
longestPalindrome1 = function (s) {
  let len = s.length,
    max = 0,
    res = "";
  for (let i = 0; i < len; i++) {
    let r = i - 1,
      g = i + 1;
    //s[i]和右边相等,假设r左侧可能还有相同字符
    while (r >= 0 && s.charAt(r) == s.charAt(i)) {
      r--;
    }
    //s[i]和左边相等,假设g右侧可能还有相同字符
    while (g < len && s.charAt(g) == s.charAt(i)) {
      g++;
    }
    //左边和右边相等,说明在[r,g]范围内的为回文字符,假设g右侧可能还有相同字符,查找最大回文字串
    while (r >= 0 && g < len && s.charAt(r) == s.charAt(g)) {
      r--;
      g++;
    }
    //查找到最大的,修改max的值,并且标记坐标位置
    if (max < g - r - 1) {
      max = g - r - 1;
      res = s.substring(r + 1, g);
    }
  }
  return res;
};

相关文章

  • 69. 最长回文子串

    day16: 5. 最长回文子串[https://leetcode-cn.com/problems/longe...

  • 最长回文子串

    最长回文子串——Manacher 算法 1. 问题定义 最长回文字符串问题:给定一个字符串,求它的最长回文子串长度...

  • 字符串算法

    最长公共前缀 最长回文串 最长回文子序列 最长公共子串 反转单词顺序列 反转字符串 字符串转数字 IP-int互转

  • 打卡-最长回文子串

    最长回文子串(中等)

  • 最长回文子序列

    该问题区别于最长回文子串,子串必须是连续的,而子序列则可以跳跃,例如AABCAA的最长回文子串为AA,但是它的最长...

  • Manacher算法

    最长回文子串问题# 给定一个字符串,找出最长的回文子串,如"waabwswbfd",则最长子串为bwsb. 中心试...

  • 最长回文子串问题—Manacher算法

    最长回文串问题是一个经典的算法题。 0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度。如果...

  • LeetCode 第647题:回文子串

    1、前言 2、思路 此题与最长回文子串很像,只不过那个是求最长的回文子串,而这个是求回文子串的数目。但是他们的解法...

  • C语言实现求最长回文子串

    最长回文子串的概念 回文串是指正序和反序都一样的字符串,例如:Str1 = "AbbA",则Str1的最长回文子串...

  • Manacher's Algorithm算法分析Java

    Manacher's Algorithm俗称马拉车算法,对于求字符串中最长回文子串效率极高。 在求最长回文子串的时...

网友评论

    本文标题:69. 最长回文子串

    本文链接:https://www.haomeiwen.com/subject/dxujrrtx.html