美文网首页算法
回文数子串

回文数子串

作者: mapleLeaf_X | 来源:发表于2018-07-05 11:35 被阅读0次

回文数概念

回文是指正读反读都能读通的句子,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数。

中心扩展法

中心扩展法就是字面意思,从中间向两端扩展,判断字符是否一致,进行遍历。

回文数字串

采用中心扩展法来获取,但是会存在奇数和偶数的回文子串,所以这两种方法需要分开考虑。
第一种

  /**
 * @param {string} s
 * @return {string}
 */
function longestPalindrome(s) {
    
    const len = s.length;
    if (len < 2) return s;
    
    let max = 1;
    let resultStr = s.substr(0, 1);
     
    // 奇数扩展法
    for (let i = 0; i < len; i += 1) {
        let start = i - 1;
        let end = i + 1;
        
        while (start >= 0 && end < len && s.charAt(start) === s.charAt(end)) {
            start -= 1;
            end += 1;
        }
        
        if ((end - 1) - (start + 1) + 1 > max) {
            max = (end - 1) - (start + 1) + 1;
            resultStr = s.substr(start + 1, max);
        }
    }
    
    // 偶数扩展法
    for (let i = 0; i < len; i += 1) {
        let start = i;
        let end = i + 1;
        
        while (start >= 0 && end < len && s.charAt(start) === s.charAt(end)) {
            start -= 1;
            end += 1;
        }
        
        if ((end - 1) - (start + 1) + 1 > max) {
            max = (end - 1) - (start + 1) + 1;
            resultStr = s.substr(start + 1, max);
        }
    }
    
    return resultStr;
    
};

let  s = 'babad';
longestPalindrome(s); // bab

第二种

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    let curNum = 0,maxLen = 1;
    for( let i = 0; i < s.length;i++) {
        const len1 = getNum(s, i, i);
        const len2 = getNum(s, i, i+1);
        const max = Math.max(len1, len2);
        if(max > maxLen) {
            maxLen = max;
            curNum = i - (max-1)/2;
            curNum = len1 > len2 ? curNum : curNum+1
        }
    }
    return s.substr(curNum,maxLen)
};
            
function getNum(s, left,right) {
    while(left >= 0 && right < s.length && s[left] === s[right]) {
        left--;
        right++;
    } 
    return right -left - 1;
}
let  s = 'babad';
longestPalindrome(s); // bab

github算法地址

相关文章

  • 回文数子串

    回文数概念 回文是指正读反读都能读通的句子,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为...

  • 最长回文子串

    判断是否是回文字符串 获取所有可能子串 获取所有回文子串 进阶

  • LeetCode 第647题:回文子串

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

  • 最长回文子串

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

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

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

  • 打卡-最长回文子串

    最长回文子串(中等)

  • 最长回文子序列

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

  • 最长回文子串杀器-马拉车算法 2020-09-07(未允禁转)

    1.求解最长回文子串 在之前博客中提到解决回文串问题时,是利用了大回文串 = 小回文串向两头扩展的性质得到状态转移...

  • Manacher's Algorithm算法分析Java

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

  • 字符串---Manacher

    求最长回文子串 求一个串中的回文子串,首先将字符串处理成奇数个。如"abbc"处理成Ma = "$ a # b #...

网友评论

    本文标题:回文数子串

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