求最长回文字符串

最长回文串

算法思路:将字符串变为数组,再将数组长度通过填充undefined变为奇数长(在字符中间以及两头插入字符串),从左往右遍历数组,每个字符都用朴素计算法,即判断与字符距离相同的两个字符是否相同,相同则计数器加一,往两侧遍历,直到数组边界或者两侧的符号不同位置。最后遍历存半径长度的数组,找到半径长度最长的字符的位置以及半径长度,通过计算找到源字符串的最长回文串。

var longestPalindrome = function(s) {
	if (s == '') {
		return '';
	}
    var arr = [];//存放插入undefined的数组
    var len = [];//存放半径长度的数组
    var s_length = s.length;
    var arr_length;
    var max = 0;
    var maxIndex = 0;
    for(var i = 0; i < s_length; i++){
    	arr.push(undefined);
    	arr.push(s[i]);
    }
    arr.push(undefined);
    arr_length = arr.length;
    
    //求每个字符的回文半径
    for(var i = 0; i < arr_length; i++){
        len[i] = countLen(arr,i);
    }
    //遍历数组求回文半径最大的符号的位置以及值
    for(i = 0; i < arr_length; i++){
        if(max < len[i]){
            max = len[i];
            maxIndex = i;
        }
    }
	//当回文半径是1并且该位置的字符是undefined的时候,返回第一个字符
    if (arr[maxIndex] == undefined) {
    	if (max <= 1) {
    		return s[0];	
    	}
    }
    //因为arr是插入undefined的数组,len是插入过undefined字符的半径数组,所以max、maxIndex长度要减半
    return s.slice(maxIndex/2 - (max/2-1),maxIndex/2 + (max/2));
};
function countLen(s,i){
    var count = 1;
    var length = s.length;
    var left = i-1;
    var right = i+1;
    while(left >= 0 && right < length && s[left--] == s[right++]){
        count++;
    }
    return count;
}	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值