链表(篇4)链表中的最长回文序列长度(O(1)额外空间)

2024-09-04 02:08

本文主要是介绍链表(篇4)链表中的最长回文序列长度(O(1)额外空间),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

给定一个链表,找出该链表中存在的最长回文序列的长度。
例子:

输入:List = 2-> 3-> 7-> 3-> 2-> 12-> 24 
输出:5 
最长的回文是2-> 3-> 7-> 3-> 2 
Input:List = > 4-> 4-> 3-> 14 
输出:2 
最长的回文为4-> 4

在求链表的最长回文序列的长度之前,先看看怎么求一个给定的链表是否是回文序列。

判断链表是否是回文序列

解法1(时间复杂度O(n),空间复杂度O(n))
使用一个栈来保存链表的后半部分,然后将前后部分进行对比。如下图:
这里写图片描述
为了将后半部分撞到栈中,可以使用一个slow和一个fast指针遍历链表,fast每次向前走两下,slow每次向前走一下,这样当fast走到末尾时,slow正好走到中间,利用slow遍历完链表同时将节点撞到栈中。

public boolean isPalindrome(ListNode head){if(head==null)return false;ListNode cur=head;ListNode slow=head;ListNode fast=head;Stack<ListNode> stack=new Stack<ListNode>();//slow 每次走一下,fast每次走两下      while(fast.next!=null&&fast.next.next!=null){slow=slow.next;fast=fast.next.next;}//将链表后半部分入栈while(slow.next!=null){stack.push(slow.next);slow=slow.next;}       cur=head;//比较链表的前半部分和栈中的值是否一致while(!stack.isEmpty()&&cur.val==stack.pop().val)cur=cur.next;           return stack.isEmpty();}
//节点结构
class ListNode{ListNode next=null;int val;public ListNode(int val) {this.val = val;}
}

解法2(时间复杂度O(n),空间复杂度O(1))
将后半部分的节点的指针进行反转,这样就可以同时从后往前和从前往后进行比较了如下图:
这里写图片描述

    public boolean isPalindrome1(ListNode head){if(head==null)return false;ListNode slow=head;ListNode fast=head;ListNode cur;ListNode tail;  while(fast.next!=null&&fast.next.next!=null){slow=slow.next;fast=fast.next.next;}slow=reverse(slow); //反转后半指针tail=slow;cur=head;//前半部分和后半部分进行比较while(cur!=null&&tail!=null){if(cur.val!=tail.val)return false;cur=cur.next;tail=tail.next;}reverse(slow);//反转后半指针将原链表还原。return true;}//反转函数。public ListNode reverse(ListNode head){ListNode cur=head;ListNode next=head.next;ListNode pre;cur.next=null;while(next!=null){pre=next.next;next.next=cur;cur=next;next=pre;           }return cur;}

链表中的最长回文序列

一个简单的解决方案可能是将链表内容复制到数组,然后在数组中找到最长的回文子数组,但不允许使用此解决方案,因为它需要额外的空间。解法:迭代的反转链表的指针,然后从当前节点开始向两边找最大回文子数组。因为当前节点的前面指针已经反转可以直接遍历。


    public static int countCommon(ListNode List1,ListNode List2){int count=0;while((List1!=null&&List2!=null)&&(List1.val==List2.val)){count++;List1=List1.next;List2=List2.next;}return count;}public static int longestpalindrome(ListNode head){int result=0;ListNode pre=null;ListNode next,current=head;while(current!=null){System.out.println(current.val);next=current.next;current.next=pre;//反转当前节点的指针,从当前节点开始,向两边寻找最大回文result=Math.max(2*countCommon(pre,next)+1, result);//因为回文有两种情况一种是偶数的,一种是奇数的。//所有有两种方式寻找。result=Math.max(2*countCommon(current,next), result);pre=current;current=next;}return result;}

这篇关于链表(篇4)链表中的最长回文序列长度(O(1)额外空间)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134699

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决