leetcode刷题之回文链表and最长回文子串

news2024/11/24 19:40:36

234.回文链表

方法一:找中间结点,断开链表,后一段链表进行反转

思路:①找中间结点:使用快慢指针fast,slow,fast每次走两个,slow每次走一个;
如果链表的个数是奇数个,那么最后slow指向中间节点
如果链表的个数是偶数个,那么最后slow指向中间两个节点的后一个
②使用prev指针保存slow的前一个结点,然后prev.next = null 将链表分成前后两段
③将后一段链表进行反转,然后两段链表进行比对
在这里插入图片描述

/**
 * @param {ListNode} head
 * @return {boolean}
通过快慢指针找到中间节点,然后将链表分成前后两段 将后段链表进行反转 然后比较
奇数个结点,最后slow指向中间的结点;偶数个结点,最后slow指向中间两个结点的后一个
 */
var isPalindrome = function(head) {
    if(head==null||head.next==null){
        return true
    }
    let fast = head
    let slow = head
    let prev
    while(fast&&fast.next){
        prev = slow
        slow = slow.next
        fast = fast.next.next
    }
    //将链表断开
    prev.next = null
    //将后半段链表进行反转
    let tempNode = null
    while(slow){
        let nextNode = slow.next
        slow.next = tempNode
        tempNode = slow
        slow = nextNode
    }
    //进行比较 两个链表  如果原来的链表是奇数个 那么分段之后的链表 后一段会多一个结点
    let head2 = tempNode
    while(head&&head2){
        if(head.val!==head2.val){
            return false
        }
        head = head.next
        head2 = head2.next
    }
    return true
};

方法二:遍历链表,将val保存到数组中,然后使用reverse()反转数组,然后进行比对

注意:reverse()会改变原来的数组,这里使用slice()创建了一个新的数组进行反转

/**
 * @param {ListNode} head
 * @return {boolean}
将链表的值全都放入数组中,然后进行数组的反转  reverse() 会改变原数组
 */
var isPalindrome = function(head) {
    if(head==null||head.next==null){
        return true
    }
    let cur = head
    let res = []
    while(cur!==null){
        res.push(cur.val)
        cur = cur.next
    }
    //reverse() 会改变原数组  于是想着使用formerArr来保存原来的数组 这样是不对的 res:数组和对象是复杂类型,变量中保存的是地址
    // let formerArr = res   这样是不对的 当res变化的时候 formerArr也会变化
    //使用slice()来创建一个新的数组 这样就不会改变原来的数组
    let reverseArr = res.slice().reverse()
    for(let i=0;i<res.length;i++){
        if(res[i]!==reverseArr[i]){
            return false
        }
    }
    return true
};

方法三:同样是将val保存到数组中,这里不反转数组

思路:保存到数组之后,从数组首尾进行比对

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {boolean}
将链表的值全都放入数组中,然后进行数组的反转  reverse() 会改变原数组
 */
var isPalindrome = function(head) {
    if(head==null||head.next==null){
        return true
    }
    let cur = head
    let arr = []
    while(cur!==null){
        arr.push(cur.val)
        cur = cur.next
    }
    let start = 0,end = arr.length - 1
    while(end>=start){
        if(arr[start]!==arr[end]){
            return false
        }
        start++
        end--
    }
    return true

};

9.回文数

var isPalindrome = function(x) {
//转换成字符串
    let str = x.toString()
    let i = 0
    let tempStr = ''
    //进行反转
    while(i<str.length){
        tempStr = str.charAt(i) + tempStr
        i++
    }
    if(tempStr === str){
        return true
    }else{
        return false
    }
};

5.最长回文子串

方法一:中心元素拓展法

var longestPalindrome = function(s) {
   //中心扩展法 直接拼接字符串
   let maxStr = ''
   //下标为i的 都可以作为一次中心元素 向两侧进行拓展
   for(let i=0;i<s.length;i++){
       let left = i-1
       let str = s[i]
       //如果遇到相同的元素,就像将其拼接上  res:相同的元素总是对称的 然后向两侧进行拓展
       while(s[i+1]==s[i]){ //这里不用考虑越界的问题,如果i+1越界了,那么这里就不会相等
           str = str + s[i+1]      //如果遇到相邻的一连串相同的元素,都要将其加上,如果不加上的话,一定比全都有的情况要短
           i++              //因为相同的连续元素都要加上,这里就直接i++了,不用重复进行遍历了 
       }
       //中心元素右侧
       let right = i+1
       while(s[left]==s[right]&&s[left]!==undefined){//要防止left越界  这里right如果越界了,那么等号就不成立了
           str = s[left] + str + s[right]
           left--
           right++
       }
       if(str.length>maxStr.length){
           maxStr = str
       }
   }
   return maxStr
};

中心元素拓展法优化

var longestPalindrome = function(s) {
    //最大长度
   let max = 1
   //字符串开始的位置
   let now = 0
   //下标为i的 都可以作为一次中心元素 向两侧进行拓展
   for(let i=0;i<s.length;i++){
       let left = i-1
       //当前长度
       let curNum = 1
       //如果遇到相同的元素,就像将其拼接上  res:相同的元素总是对称的 然后向两侧进行拓展
       while(s[i+1]==s[i]){ //这里不用考虑越界的问题,如果i+1越界了,那么这里就不会相等
           curNum++     //如果遇到相邻的一连串相同的元素,都要将其加上,如果不加上的话,一定比全都有的情况要短
           i++              //因为相同的连续元素都要加上,这里就直接i++了,不用重复进行遍历了 
       }
       //中心元素右侧
       let right = i+1
       while(s[left]==s[right]&&s[left]!==undefined){//要防止left越界  这里right如果越界了,那么等号就不成立了
           curNum+=2
           left--
           right++
       }
       if(max<curNum){
           max = curNum
           //为啥要加1   因为在向两则进行拓展的时候,left先减一 然后再去判断
           now = left + 1
       }
   }
   return s.slice(now,now+max)
};

方法二:动态规划

var longestPalindrome = function(s) {
    //动态规划  使用一个二维数组来保存 i到j之间的字符串是否是回文字符串
    let len  = s.length
    //创建一个二维数组  如果arr[i][j] = 1 那么i到j之间是回文字符串
    let arr = new Array(len).fill(0).map(item => item = new Array(len).fill(0))
    //记录最大长度
    let max = 0
    //记录最大长度字符串的起始位置
    let maxStart = 0,maxEnd = 0
    let r = 0,l = 0
    for( r = 1;r<len;r++){
        for( l = 0;l<r;l++){
            // r-l<=2 最多有三个元素
            if(s[l]==s[r]&&(r-l<=2 || arr[l+1][r-1]==1)){
                arr[l][r] = 1
                if(max<r-l+1){
                    max = r-l+1
                    maxStart = l
                    maxEnd = r
                }
            }
        }
    }
    return s.slice(maxStart,maxEnd+1)
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/478674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文心一言 VS chatgpt (13)-- 算法导论3.1 8题 3.2 1题

八、可以扩展我们的记号到有两个参数n和m的情形&#xff0c;其中的n和m可以按不同速率独立地趋于无穷。对于给定的函数g(n, m)&#xff0c;用O(g(n, m))来表示以下函数集&#xff1a; O(g(n, m)) { f(n, m): 存在正常量c、和&#xff0c;使得对所有n>n0或m>m0&#xff…

unity 性能优化之合批和剔除

批次对渲染的性能影响是比较大的&#xff0c;批次过多会导致cpu提交的次数过多&#xff0c;导致每帧渲染时间过长&#xff0c;所以我们需要对其优化&#xff0c;减少Bathches数量和SetPassCall次数。 批次合并的方法有多种&#xff0c;下面一一列出&#xff1a; 手动合批 将相…

CRM系统多少钱一套?盘点主流各大CRM系统价格

阅读本文你将了解&#xff1a;1.CRM定价规则&#xff1b;2.各大CRM系统报价&#xff08;CRM系统多少钱一套&#xff09;;3.CRM系统费用构成。 一、CRM定价规则 很多企业都寻求使用CRM系统来管理客户关系&#xff0c;从而优化管理流程&#xff0c;提升业绩。 对于企业而言&…

1985-2021年全国31省一二三产业就业人数/各省分产业就业人数数据(无缺失)

1985-2021年全国31省一二三产业就业人数/各省分产业就业人数数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1985-2021年 2、范围&#xff1a;包括全国31省 3、来源&#xff1a;各省NJ、社会统计NJ、人口和就业NJ 4、指标包括&#xff1a;省第一产业就业人数、省第…

Baumer工业相机堡盟相机如何使用PixelTransformation像素转换功能(像素转换功能的使用和优点以及行业应用)(C#)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具…

2023年,web前端工程师20道Vue面试题及解析

本文章列出了20道关于Vue.js的面试题&#xff0c;包括基础和进阶问题&#xff0c;并提供了问题的答案及解析&#xff0c;以帮助读者更好地准备面试。从指令、生命周期函数到组件间通信和路由等各方面都作了涉及。 1. 什么是Vue.js&#xff1f;它有哪些特点&#xff1f; 答案&…

Git服务器集成(一)

本篇文章旨在分享本人在学习Git时的随笔记&#x1f929; 文章目录 Git 远程服务器1、下载 Git 软件&#xff08;linux版本&#xff09;2、安装 Git 软件2.1 解压 Git2.2 安装依赖2.3 删除旧版 Git2.4 编译、安装 Git2.5 配置环境变量2.6 建立链接文件2.7 测试安装 3、创建 Git …

使用Selenium控制Chrome浏览器 --工作自动化

使用Selenium控制Chrome浏览器 --工作自动化 背景&#xff1a; 最近朋友在用秒账做帐时&#xff0c;由于销售单量很大&#xff0c;重复录入工作一天一录就近五个小时&#xff0c;寻求帮助&#xff0c;问能不能把这重复劳动减少些&#xff0c;看后分析&#xff0c;使用web自动…

为网站的中文和英文使用不同的字体

CSS为网站的中文和英文使用不同的字体 前言 最近我在搭建个人网站&#xff0c;在这个过程中遇到很多的问题&#xff0c;不过chatGPT3.5帮助了很多&#xff0c;这是我使用的咒语&#xff1a; 我正在搭建一个个人网站&#xff0c;使用python Flask框架&#xff0c;CSS采用Boots…

linux网络设置与维护命令

文章目录 一、linux网络设置与维护命令总结 一、linux网络设置与维护命令 Linux ifconfig命令:配置或显示网络接口信息 Linux netstat命令:显示网络状态 Linux ip命令:执行网络管理任务 Linux ping命令:测试主机间网络连通性 Linux wall命令:发送广播 Linux finger命令:查找并…

ShardingJDBC的实核心流程和商户商家订单的分片实现

一、ShardingJDBC的核心流程 ShardingJDBC的核心流程主要分成六个步骤&#xff0c;分别是&#xff1a;SQL解析->SQL优化->SQL路由->SQL改写->SQL执行->结果归并&#xff0c;流程图如下: 4.1、SQL解析 分为词法解析和语法解析。 先通过词法解析器将SQL拆分为一…

基于ESP32 蓝牙游戏手柄设计

使用 ESP32 并通过 BLE 通信的 DIY 手持游戏手柄 这个项目中使用的东西 硬件组件 esp32 1 ws2812b 6 操纵杆 2 角度按钮 2 按钮 8 18560电池和电池座 2 3路拨动开关 1 TP4056带保…

【从0到1了解Libarchive】带你了解Libarchive Libarchive的用途意义以及成功入门Libarchive

目录 0 如果你还不知道Libarchive是什么请一定要先看一下 1 简介 1.1 为什么实现Libarchive 1.2 到底都有谁在用呢&#xff1f; 1.3 Libarchive都有哪些功能 1.4 我们可以通过这些获取更多信息 1.5 如何贡献 2 Libarchive归档与压缩 3 Libarchive编译 4 Libarchive简…

ApplicationContext 和 BeanFactory 的区别

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 ApplicationContext 和 BeanFactory 的区别 ApplicationContext 和 BeanFactory 的区别 那么这 2 种获取 Spring 上下文对象…

搭建electron-vue上

electron-vue 准备工作修改package.jsonappveyor.yml.travis.yml.gitignore.eslintrc.js.eslintignore.babelrcsrc/renderer/main.jssrc/renderer/App.vuesrc/renderer/store/index.jssrc/renderer/store/modules/Counter.jssrc/renderer/store/modules/Counter.jssrc/renderer…

渗透测试 | 目录扫描

0x00 免责声明 本文仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担…

BUUCTF ciscn_2019_n_8

小白垃圾做题笔记而已&#xff0c;不建议阅读观看。 看到保护后我………………傻眼了。这保护全看根本无从下手嘛。 看到源程序后我依然有点迷茫。 我是小白&#xff0c;直到看到了大佬的wp&#xff0c;我才有有点头绪。 这里&#xff0c;var[13]里的不能为0 并且里边存储的还…

Java 基础入门篇(六)——— String 类详解

文章目录 一、String 类概述二、String 创建对象的方式2.1 创建对象的两种方式2.2 面试&#xff1a;两种方式的区别 ★2.3 常见面试题 ★ 三、String 类常用方法3.1 字符串内容比较3.2 常用 API&#xff1a;遍历、截取、替换、分割 一、String 类概述 java.lang.String 类代表…

R语言 | 日期和时间的处理

目录 一、日期的设定与使用 1.1 as.Date()函数 1.2 weekdays()函数 1.3 months()函数 1.4 quarters()函数 1.5 Sys.localeconv()函数 1.6 Sys.Date()函数 1.7 再谈seq()函数 1.8 使用不同格式表示日期 二、时间的设定与使用 2.1 Sys.time()函数 2.2 as.POSIXct()函数…

ChatGPT学习企业产品、服务内容、往期方案,处理所输入的客户需求,定制化生成解决方案

该场景对应的关键词库&#xff08;6个&#xff09;&#xff1a; 企业产品和服务内容、客户需求和参数、营销方案和推广策略、数据处理和模型训练、客户满意度和营销效率、往期营销方案 提问模板&#xff1a; 场景产品问题 模板1&#xff1a; 场景&#xff1a;某家电公司生产的…