LeetCode 5

最长回文子串

动态规划

====================================================================

d p [ i ] [ j ] = d p [ i + 1 ] [ j − 1 ]    a n d    s [ i ] = = s [ j ] dp[i][j] = dp[i+1][j-1] \ \ and \ \ s[i]==s[j] dp[i][j]=dp[i+1][j−1]  and  s[i]==s[j]

长串依赖短串的状态。

所以枚举长度的时候从大到小。

const int N = 1010;

class Solution {

public:

string longestPalindrome(string s) {

string ans = “”;

int maxLen = 0, n = s.size();

bool dp[N][N];

for(int len = 1; len <= n ; len ++ ) {

for(int i = 0; i + len -1 < n ; i++ ) {

int j = i + len - 1;

if(len == 1){

dp[i][j] = 1;

}else if(len == 2){

dp[i][j] = s[i] == s[j];

}else{

dp[i][j] = dp[i+1][j-1] && s[i]==s[j];

}

if(dp[i][j] && len > maxLen){

maxLen = len;

ans = s.substr(i,len);

}

}

}

return ans;

}

};

枚举中心点+中心拓展

==========================================================================

class Solution {

public:

pair<int, int> expandAroundCenter(const string& s, int left, int right) {

while (left >= 0 && right < s.size() && s[left] == s[right]) {

–left;

++right;

}

return {left + 1, right - 1};

}

string longestPalindrome(string s) {

int start = 0, end = 0;

for (int i = 0; i < s.size(); ++i) {

auto [left1, right1] = expandAroundCenter(s, i, i);

auto [left2, right2] = expandAroundCenter(s, i, i + 1);

if (right1 - left1 > end - start) {

start = left1;

end = right1;

}

if (right2 - left2 > end - start) {

start = left2;

end = right2;

}

}

return s.substr(start, end - start + 1);

}

};

// 作者:LeetCode-Solution

// 链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-by-leetcode-solution/

// 来源:力扣(LeetCode)

// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

字符串hash+二分

==========================================================================

利用这个过程的单调性,所以可以二分解决,为了快速判断一个串是否是回文串,可以使用字符串hash。实际上是对上面方法的优化。

时间复杂度: O ( n ∗ l o g ( n ) ) O(n*log(n)) O(n∗log(n))

class Solution {

public:

typedef unsigned long long ull;

const static int P = 1e9+7, N = 1010;

ull h1[N] = {0}, h2[N] = {0}, p[N] = {1};

string ans;

int maxlen,n;

string longestPalindrome(string s) {

maxlen = 0, n = s.size();

s = " "+s;

// 求正反字符串hash

for(int i=1;i<=n;i++){

h1[i] = h1[i-1]*P + (s[i]-‘0’+1);

h2[n-i+1] = h2[n-i+2]*P + (s[n-i+1]-‘0’+1);

p[i] = p[i-1]*P;

}

// 奇回文

for(int i = 1; i <= n ; i ++ ){

int l = 0 , r = min(i-1,n-i);

while(l<r){

int mid = l+(r-l+1)/2;

bool f = checkPalindrome(i-mid,i+mid);

if(f){

l = mid;

}else{

r = mid - 1;

}

}

if(2*l+1 > maxlen){

maxlen = 2*l+1;

ans = s.substr(i-l,2*l+1);

}

}

// 偶回文

for(int i = 2; i <= n ; i++ ){

int l = 1 , r = min(i-1,n-i+1);

while(l<r){

int mid = l+(r-l+1)/2;

bool f = checkPalindrome(i-mid,i+mid-1);

if(f){

l = mid;

}else{

r = mid - 1;

}

}

if(2*l > maxlen && checkPalindrome(i-l,i+l-1)){

maxlen = 2*l;

ans = s.substr(i-l,2*l);

}

}

return ans;

}

// 根据字符串hash值判断字符串是否相等

bool checkPalindrome(int l,int r){

if(r>n) return false;

ull hash1 = h1[r] - h1[l-1]*p[r-l+1];

ull hash2 = h2[l] - h2[r+1]*p[r-l+1];

return hash1 == hash2;

}

};

Manacher算法

==========================================================================

class Solution {

public:

string longestPalindrome(string s) {

string str = divide(s);

int strlen = str.size(), maxLen = 0, start = 0;

// manacher算法中最重要的三个量

vector p(strlen,0);

int maxRight = 0, center = 0;

for(int i = 0;i < strlen ; i++) {

int mirror = 2*center - i;

if(i < maxRight){

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

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

相关文章

让文物“活”起来,以3D数字化技术传承文物历史文化!

文物&#xff0c;作为不可再生的宝贵资源&#xff0c;其任何毁损都是无法逆转的损失。然而&#xff0c;当前文物保护与修复领域仍大量依赖传统技术&#xff0c;同时&#xff0c;文物管理机构和专业团队的力量相对薄弱&#xff0c;亟需引入数字化管理手段以应对挑战。 积木易搭…

一文解释nn、nn.Module与nn.functional的用法与区别

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;零基础入门PyTorch框架_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 …

HAL库外设宝典:基于CubeMX的STM32开发手册(持续更新)

目录 前言 GPIO&#xff08;通用输入输出引脚&#xff09; 推挽输出模式 浮空输入和上拉输入模式 GPIO其他模式以及内部电路原理 输出驱动器 输入驱动器 中断 外部中断&#xff08;EXTI&#xff09; 深入中断&#xff08;内部机制及原理&#xff09; 外部中断/事件控…

mac 安装 dotnet 环境

目录 一、安装准备 二、安装方法&#xff08;两种任选&#xff09; 方法 1&#xff1a;使用官方安装包&#xff08;推荐新手&#xff09; 方法 2&#xff1a;使用 Homebrew&#xff08;适合开发者&#xff09; 1. 安装 Homebrew&#xff08;如未安装&#xff09; 2. 通过 …

ChatGPT怎么回事?

纯属发现&#xff0c;调侃一下~ 这段时间deepseek不是特别火吗&#xff0c;尤其是它的推理功能&#xff0c;突发奇想&#xff0c;想用deepseek回答一些问题&#xff0c;回答一个问题之后就回复服务器繁忙&#xff08;估计还在被攻击吧~_~&#xff09; 然后就转向了GPT&#xf…

结合深度学习、自然语言处理(NLP)与多准则决策的三阶段技术框架,旨在实现从消费者情感分析到个性化决策

针对电商个性化推荐场景的集成机器学习和稳健优化三阶段方案。 第一阶段:在线评论数据处理&#xff0c;利用深度学习和自然语言处理技术进行特征挖掘&#xff0c;进而进行消费者情感分析&#xff0c;得到消费者偏好 在第一阶段&#xff0c;我们主要关注如何通过深度学习和自然语…

GrassWebProxy

GrassWebProxy第一版&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using System.IO; using Newtonsoft.Json;…

Websocket从原理到实战

引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议&#xff0c;它使得客户端和服务器之间能够进行实时、双向的通信&#xff0c;既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解 发展历史 WebSocket 最初是为了解决 HTTP 协议在实时…

[LeetCode]day16 242.有效的字母异位词

242. 有效的字母异位词 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的 字母异位词 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输入: s "rat"…

计算机考研复试上机02

目录 3、排序 1)排序(华中科技大学复试上机题) 2)成绩排序(清华大学复试上机题) 3)特殊排序(华中科技大学复试上机题) 4)整数奇偶排序(北京大学复试上机题) 5)小白鼠排队(北京大学复试上机题) 4、查找 1)找 x(哈尔滨工业大学复试上机题) 2)查找(北…

UnityShader学习笔记——动态效果

——内容源自唐老狮的shader课程 目录 1.原理 2.Shader中内置的时间变量 3.Shader中经常会改变的数据 4.纹理动画 4.1.背景滚动 4.1.1.补充知识 4.1.2.基本原理 4.2.帧动画 4.2.1.基本原理 5.流动的2D河流 5.1.基本原理 5.2.关键步骤 5.3.补充知识 6.广告牌效果 …

MySQL万能备份脚本

此脚本适用于 MySQL 各个生命周期的版本 #!/bin/bash # mybackup.sh# 备份保留天数&#xff0c;建议保留三天 days7 # 备份时间 time$(date %Y%m%d%H%M%S) # 备份保存路径 backup_dir/opt/backup # 备份工具 toolmysqldump # 端口 port"3306" # 是否采用 --all-data…

【Redis keys命令有什么问题?】

Redis keys命令有什么问题? 性能问题实际使用中的限制替代方案示例讲解Redis keys命令的问题示例替代方案:使用SCAN命令Java代码示例性能问题 时间复杂度:keys命令的时间复杂度是O(n),其中n是Redis中键的总数。这意味着,当Redis中存储的键数量非常大时,执行keys命令会遍历…

Python用langchain、OpenAI大语言模型LLM情感分析苹果股票新闻数据及提示工程优化应用...

全文链接&#xff1a;https://tecdat.cn/?p39614 本文主要探讨了如何利用大语言模型&#xff08;LLMs&#xff09;进行股票分析。通过使用提供的股票市场和金融新闻获取数据&#xff0c;结合Python中的相关库&#xff0c;如Pandas、langchain等&#xff0c;实现对股票新闻的情…

第19章 Future设计模式(Java高并发编程详解:多线程与系统设计)

1.先给你一张凭据 假设有个任务需要执行比较长的的时间&#xff0c;通常需要等待任务执行结束或者出错才能返回结果&#xff0c; 在此期间调用者只能陷入阻塞苦苦等待&#xff0c; 对此&#xff0c; Future设计模式提供了一种凭据式的解决方案。在我们日常生活中&#xff0c;关…

v-for 为什么加 key?不加 key 会怎么样?

在 Vue.js 中,v-for 指令用于渲染列表。当使用 v-for 渲染列表时,通常推荐为每个项目提供一个唯一的 key 属性。以下是为什么要加 key 以及不加 key 会发生什么的详细说明: 为什么要加 key 提高性能: Vue.js 在渲染列表时,会根据 key 来追踪每个节点的身份。当节点的 key…

[Android] 全球网测-版本号4.3.8

[Android] 全球网测 链接&#xff1a;https://pan.xunlei.com/s/VOIV5G3_UOFWnGuMQ_GlIW2OA1?pwdfrpe# 应用介绍 "全球网测"是由中国信通院产业与规划研究所自主研发的一款拥有宽带测速、上网体验和网络诊断等功能的综合测速软件。APP突出六大亮点优势&#xff1a…

判断您的Mac当前使用的是Zsh还是Bash:echo $SHELL、echo $0

要判断您的Mac当前使用的是Zsh还是Bash&#xff0c;可以使用以下方法&#xff1a; 查看默认Shell: 打开“终端”应用程序&#xff0c;然后输入以下命令&#xff1a; echo $SHELL这将显示当前默认使用的Shell。例如&#xff0c;如果输出是/bin/zsh&#xff0c;则说明您使用的是Z…

MySQL的存储引擎对比(InnoDB和MyISAM)

InnoDB 特点&#xff1a; 事务支持&#xff1a;InnoDB 是 MySQL 默认的事务型存储引擎&#xff0c;支持 ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;事务。行级锁定&#xff1a;支持行级锁&#xff0c;能够并发执行查询和更新操作&#xff0c;提升多用户环境…

MYSQL第四次

目录 题目分析 代码实现 一、修改 Student 表中年龄&#xff08;sage&#xff09;字段属性&#xff0c;数据类型由 int 改变为 smallint 二、为 Course 表中 Cno 字段设置索引&#xff0c;并查看索引 三、为 SC 表建立按学号&#xff08;sno&#xff09;和课程号&#xff…