链表(篇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

相关文章

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

MySQL表空间结构详解表空间到段页操作

《MySQL表空间结构详解表空间到段页操作》在MySQL架构和存储引擎专题中介绍了使用不同存储引擎创建表时生成的表空间数据文件,在本章节主要介绍使用InnoDB存储引擎创建表时生成的表空间数据文件,对... 目录️‍一、什么是表空间结构1.1 表空间与表空间文件的关系是什么?️‍二、用户数据在表空间中是怎么

CentOS7增加Swap空间的两种方法

《CentOS7增加Swap空间的两种方法》当服务器物理内存不足时,增加Swap空间可以作为虚拟内存使用,帮助系统处理内存压力,本文给大家介绍了CentOS7增加Swap空间的两种方法:创建新的Swa... 目录在Centos 7上增加Swap空间的方法方法一:创建新的Swap文件(推荐)方法二:调整Sww

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、