最长回文的五种实现(js代码实现)

本文详细介绍了利用JavaScript解决寻找最长回文的五种不同思路,包括代码实现,帮助理解回文字符串的算法处理。
摘要由CSDN通过智能技术生成

题目

给定字符串,找到它的最长回文子串,都有哪些思路呢?例如"adaiziguizhongrenenrgnohziugiziadb",回文字串很多了,但最长的是"daiziguizhongrenenrgnohziugiziad"。

解题思路

思路1:

暴力法,外面的两层循环找到所有子串,第三层循环判断子串是否是回文。方法的时间复杂度为O(n^3),空间复杂度为O(1)。

代码实现:

function makeOdd(str){
	var len = str.length;
	if(len % 2 === 1){
		return str;
	}
	var newStr = '#';
	for(i = 0;i<len;i++){
		newStr += str[i]+'#';
	}
	return newStr;
}
function judge(str){
	(str.length%2 === 0) && (str = makeOdd(str));
	var len = str.length,
		half = Math.floor(len/2),
		last = len-half;
	var i = 0;
	while(i<=last){
		if(str[half-i] !== str[half+i]){
			return false;
		}
		i++;
	}
	return true;
}
function getAllSubs(str){
	var len = str.length,
		res = [];
	for(var i = 0;i<len;i++){
		for(var j = i;j<len;j++){
			var sub = str.substring(i,j+1);
			console.error(sub);
			if(sub && judge(sub)){
				res[res.length] = sub;
			}
		}
	}
	return res;
}
console.log(getAllSubs('abaac'));

思路2:

动态规划的方法。开辟一个P[i][j]用来表示str[i..j]是否为回文,P[i][j]的状态转移方程如下:


当i==j时,P[i][j]=true
当i+1==j时,P[i][j]=str[i]==str[j]
其他,P[i][j]=P[i+1][j-1]&&(str[i]==str[j])


这样,这个方法的时间复杂度为O(n^2),空间复杂度为O(n^2)。比暴力法有很大的改进。
代码实现:
// 获取所有的子串回文情况
	function getP2(str){
		var len = str.length,
			gap = '_';
		var p = {};
		var i,j,L;
		// 只有一个字符的情况是回文
		for( i =0;i<len;i++){
			p[i+gap+i] = true;
		}
		// L是i和j之间的间隔数(因为间隔数从小到大渐增,所以大的间隔数总能包含小的间隔数)
		for(L=2;L<=len;L++){
			// 从0开始
			for(
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值