算法--最长回文子串--java--python
这个算法题里面总是有
暴力解法
把所有字串都拿出来判断一下
这里有小小的优化:
- 就是当判断的字串小于等于我们自己求得的最长回文子串的长度,那么我们就不需要在进行对这个的判断
- 这里的begin,还可以用来取得最小回文子串是什么
java
// 暴力解法最长回文子串public static int longestPalindrome(String s) {int len = s.length();if (s.length() < 2)return len;int maxLen = 1;int begin = 0;char[] chars = s.toCharArray();for (int i = 0; i < len; i++) {for (int j = i + 1; j < len; j++) {if (validPalindromic(chars, i, j))maxLen = Math.max(maxLen, j - i + 1);begin = i;}}return maxLen;}// 验证子串 s[left..right] 是否为回文串private static boolean validPalindromic(char[] chars, int left, int right) {while (left < right) {if (chars[left] != chars[right]) {return false;}left++;right--;}return true;}
python
def longestPalindrome(s: str) -> int:if len(s) < 2:return len(s)maxLen = 0for i in range(len(s)):for j in range(i+1, len(s)):if maxLen < j - i + 1 and s[i:j] == s[j:i:-1]:maxLen = j-i+1return maxLens = input()
print(longestPalindrome(s))
中心扩散法
以某数或者某2个数为中心进行扩散判断
// 中心扩散法最长回文子串public static int longestPalindrome2(String s) {int len = s.length();if (s.length() < 2)return len;int maxLen = 1;char[] chars = s.toCharArray();for (int i = 0; i < len; i++) {maxLen = Math.max(maxLen, expandAroundCenter(chars, i, i));maxLen = Math.max(maxLen, expandAroundCenter(chars, i, i + 1));}return maxLen;}private static int expandAroundCenter(char[] charArray, int left, int right) {while (left >= 0 && right < charArray.length && charArray[left] == charArray[right]) {left--;right++;}return right - left -1;}
python
# 中心扩展法
def longestPalindrome(s: str) -> int:if len(s) < 2:return len(s)maxLen = 0for i in range(len(s)):maxLen = max(maxLen, expand(s, i, i))maxLen = max(maxLen, expand(s, i, i+1))return maxLendef expand(s: str, left: int, right: int) -> int:while left >= 0 and right < len(s) and s[left] == s[right]:left -= 1right += 1return right - left - 1s = input()
print(longestPalindrome(s))
manacher算法
这个算法
1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|
a | a | b | b | a | a |
首先得知道几点:
- 解决对称中心是数还是数中间。
我们可以在每一个中间插入一个#,用#来代表2个数的中间,就统一了起来。
1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|
#a | #a | #b | #b | #a | #a# |
- 算法我觉得是在中心扩展的衍生
先通过中心扩展找到前几个最大的dp,然后通过已经求得的dp优化需要求得的数。
为了实现这个需要维护几个变量。已经求得的能够到最右边的回文子串的最右数、对称中心。- 对称中心左右的在圈内的dp应该是一样的。
- 如到7的时候可以得到最右为13中心为7.
- 求dp【10】的时候由于对称其,圈内的dp【10】=dp【4】=1
- 如果这个dp大于右边界,我们是不能确定的,所以最大只能取右边界。然后在扩展
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
# | a | # | a | # | b | # | b | # | a | # | a | $ |
在求新数的时候,如果这个数在这个最右子串里面,
// manacher算法最长回文子串public static int longestPalindrome(String s) {if (s.length() < 2)return s.length();// 预处理StringBuilder sb = new StringBuilder();sb.append("@#");for (int i = 0; i < s.length(); i++) {sb.append(s.charAt(i));sb.append('#');}sb.append("#$");char[] chars = sb.toString().toCharArray();int len = chars.length;int[] dp = new int[len];int maxCenter = 0, maxRight = 0, maxLen = 0;for (int i = 1; i < len - 1; i++) {dp[i] = maxRight > i ? Math.min(dp[2 * maxCenter - i], maxRight - i) : 1;while (chars[i + dp[i]] == chars[i - dp[i]])dp[i]++;if (maxRight < i + dp[i]) {maxRight = i + dp[i];maxCenter = i;}maxLen = Math.max(maxLen, dp[i]);}return maxLen - 1;}
# manacher算法
def longestPalindrome(s: str) -> int:if len(s) < 2:return len(s)s = "@#" + '#'.join(s) + "#$" # 预处理maxLen = 0maxRight = 0maxCenter = 0p = [0] * len(s)for i in range(1,len(s)-1):if i < maxRight:p[i] = min(p[2 * maxCenter - i], maxRight - i)else:p[i] = 1# 不懂为什么这个不加前面的条件就通不过while i-p[i] > 0 and i+p[i] < len(s)-1 and s[i-p[i]] == s[i+p[i]]:p[i] += 1if i + p[i] > maxRight:maxRight = i + p[i]maxCeaanter = imaxLen = max(maxLen, p[i])return maxLen - 1
相关文章:
算法--最长回文子串--java--python
这个算法题里面总是有 暴力解法 把所有字串都拿出来判断一下 这里有小小的优化: 就是当判断的字串小于等于我们自己求得的最长回文子串的长度,那么我们就不需要在进行对这个的判断这里的begin,还可以用来取得最小回文子串是什么 java // 暴…...

ElasticSearch-第二天
目录 文档批量操作 批量获取文档数据 批量操作文档数据 DSL语言高级查询 DSL概述 无查询条件 叶子条件查询 模糊匹配 match的复杂用法 精确匹配 组合条件查询(多条件查询) 连接查询(多文档合并查询) 查询DSL和过滤DSL 区别 query DSL filter DSL Query方式查…...

【AI大比拼】文心一言 VS ChatGPT-4
摘要:本文将对比分析两款知名的 AI 对话引擎:文心一言和 OpenAI 的 ChatGPT,通过实际案例让大家对这两款对话引擎有更深入的了解,以便大家选择合适的 AI 对话引擎。 亲爱的 CSDN 朋友们,大家好!近年来&…...
美团笔试-3.18
1、捕获敌人 小美在玩一项游戏。该游戏的目标是尽可能抓获敌人。 敌人的位置将被一个二维坐标 (x, y) 所描述。 小美有一个全屏技能,该技能能一次性将若干敌人一次性捕获。 捕获的敌人之间的横坐标的最大差值不能大于A,纵坐标的最大差值不能大于B。 现在…...

【12】SCI易中期刊推荐——计算机信息系统(中科院4区)
🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…...
好不容易约来了一位程序员来面试,结果人家不做笔试题
感觉以后还是不要出面试题这环节好了。好不容易约来了一位程序员来面试。刚递给他一份笔试题,他一看到要做笔试题,说不做笔试题,有问题面谈就好了,搞得我有点尴尬,这位应聘者有3年多工作经验。关于程序员岗位ÿ…...
这几个过时Java技术不要再学了
Java 已经发展了近20年,极其丰富的周边框架打造了一个繁荣稳固的生态圈。 Java现在不仅仅是一门语言,而且还是一整个生态体系,实在是太庞大了,从诞生到现在,有无数的技术在不断的推出,也有很多技术在不断的…...

EEPROM芯片(24c02)使用详解(I2C通信时序分析、操作源码分析、原理图分析)
1、前言 (1)本文主要是通过24c02芯片来讲解I2C接口的EEPROM操作方法,包含底层时序和读写的代码; (2)大部分代码是EEPROM芯片通用的,但是其中关于某些时间的要求,是和具体芯片相关的,和主控芯片和外设芯片都有关系&…...

Django4.0新特性-主要变化
Django 4.0于2021年12月正式发布,标志着Django 4.X时代的来临。参考Django 4.0 release notes | Django documentation | Django Python 兼容性 Django 4.0 将支持 Python 3.8、3.9 与 3.10。强烈推荐并且仅官方支持每个系列的最新版本。 Django 3.2.x 系列是最后…...
MySQL高级面试题整理
1. 执行流程 mysql客户端先与服务器建立连接Sql语句通过解析器形成解析树再通过预处理器形成新解析树,检查解析树是否合法通过查询优化器将其转换成执行计划,优化器找到最适合的执行计划执行器执行sql 2. MYISAM和InNoDB的区别 MYISAM:不支…...
【Java】面向对象三大基本特征
【Java】面向对象三大基本特征 1.封装 On Java 8:研发程序员开发一个工具类,该工具类仅向应用程序员公开必要的内容,并隐藏内部实现的细节。这样可以有效地避免该工具类被错误的使用和更改,从而减少程序出错的可能。彼此职责划分清晰&#x…...

蓝桥杯C++组怒刷50道真题(填空题)
🌼深夜伤感网抑云 - 南辰Music/御小兮 - 单曲 - 网易云音乐 🌼多年后再见你 - 乔洋/周林枫 - 单曲 - 网易云音乐 18~22年真题,50题才停更,课业繁忙,有空就更,2023/3/18/23:01写下 目录 👊填…...
Shell自动化管理 for ORACLE DBA
1.自动收集每天早上9点到晚上8点之间的AWR报告。 auto_awr.sh #!/bin/bash# Set variables ORACLE_HOME/u01/app/oracle/product/12.1.0/dbhome_1 ORACLE_SIDorcl AWR_DIR/home/oracle/AWR# Set date format for file naming DATE$(date %Y%m%d%H%M%S)# Check current time - …...

Unity学习日记13(画布相关)
目录 创建画布 对画布的目标图片进行射线检测 拉锚点 UI文本框使用 按钮 按钮导航 按钮触发事件 输入框 实现单选框 下拉菜单 多选框选项加图片 创建画布 渲染模式 第一个,保持画布在最前方,画布内的内容显示优先级最高。 第二个,…...

初阶C语言:冒泡排序
冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。1.冒泡排序关于冒泡排序我们在讲…...

带头双向循环链表
在前面我们学习了单链表,发现单链表还是有一些不够方便,比如我们要尾插,需要遍历一遍然后找到它的尾,这样时间复炸度就为O(N),现在我们引入双向带头链表就很方便了,我们先看看它的结构。通过观察,我们发现一…...

C#中的DataGridView中添加按钮并操作数据
背景:最近在项目中有需求需要在DataGridView中添加“删除”、“修改”按钮,用来对数据的操作以及显示。 在DataGridView中显示需要的按钮 首先在DataGridView中添加需要的列,此列是用来存放按钮的。 然后在代码中“画”按钮。 if (e.Column…...
WEB安全 PHP基础
WEB安全 PHP基础 PHP简述 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。 在一个php文件中可以包括以下内容: PHP 文件可包含文本、HTML、…...

基础篇:07-Nacos注册中心
1.Nacos安装部署 1.1 下载安装 nacos官网提供了安装部署教程,其下载链接指向github官网,选择合适版本即可。如访问受阻可直接使用以下最新稳定版压缩包:📎nacos-server-2.1.0.zip,后续我们也可能会更改为其他版本做更…...

端口镜像讲解
目录 端口类型 镜像方向 观察端口位置 端口镜像实现方式 流镜像 Vlan镜像 MAC镜像 配置端口镜像 配置本地观察端口 配置远程流镜像(基于流镜像) 端口镜像是指将经过指定端口的报文复制一份到另一个指定端口,便于业务监控和故障定位…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...