回文串算法题
回文串是一个正着读和反着读顺序一样的字符串。aba 是回文串abba 是回文串abc 不是回文串。回文串的题目都要使用一个基本的逻辑就是判断当前这个字符串是不是回文串。以 c 为例代码如下。这种方法也可以称为双指针法两个指针从字符串的两端向中间遍历每个字符如果中间发现两个字符不相同则不是回文字符串遍历到最后说明是回文串。bool isPalindrome(const string s) { int len s.size(); if (len 1) { return true; } int left 0; int right len - 1; //决策使用还是就看有没有必要在这里没有必要所以使用 while (left right) { if (s[left] ! s[right]) { return false; } left; right--; } return true; }双指针法在其它数据结构题目中也会用到比如链表中会用到快慢指针也属于双指针。快速排序算法中给选中的数据找到合适的位置也会使用两个指针从两边向中间对数据进行遍历也属于双指针。判断回文串也可以使用从中间向两边的方法使用这种方法时首先需要判断字符串的长度是奇数还是偶数如果是奇数的话那么两个指针从中间的位置开始向两边遍历偶数的话两个指针分别从中间两个元素的位置开始遍历。没有特殊要求的话优先选用从两边向中间的方式来判断一个字符串是不是回文串。1 验证回文串leetcode验证回文串题目要求判断给定的字符串是不是回文串如果是回文串则返回 true如果原字符串不是回文串那么最多可以删除一个字符如果删除一个字符之后的字符串是回文串那么返回 true否则返回 false。1.1 基础算法1判断原字符串是不是回文串是回文串返回 true否则执行第 2 步2遍历字符串的每个字符分别将每个字符删除判断删除字符之后的字符串是不是回文串。如果是回文串则返回 true停止遍历如果字符遍历结束则返回 false。这种算法的时间复杂度是 O(n 的平方)偏大所以优先选用第二种方法第二种算法的时间复杂度是 O(n)。1.2 双指针动态判断1使用双指针从两边向中间遍历每个字符2如果遍历到两个字符不相等则讨论如下两种情况① 删除左边的字符判断子串是不是回文串是的话则返回 true② 删除右边的字符判断子串是不是回文串是的话返回 true如果两种情况都不是回文串那么返回 false。3如果字符串遍历结束都满足回文串的要求则返回 trueclass Solution { public: bool validPalindrome(string s) { int len s.size(); int left 0; int right len - 1; bool result true; while (left right) { if (s[left] ! s[right]) { if (isPalindrome(s.substr(left 1, right - left))) { return true; } if (isPalindrome(s.substr(left, right - left))) { return true; } return false; } left; right--; } return true; } bool isPalindrome(const string s) { int len s.size(); if (len 1) { return true; } int left 0; int right len - 1; while (left right) { if (s[left] ! s[right]) { return false; } left; right--; } return true; } };2 最长回文子串leetcode最长回文子串一个字符串 s找到 s 中最长的回文子串。2.1 动态规划将所有的子串的情况都遍历到在遍历的过程中判断子串是不是回文串如果是回文串并且长度比已有的回文串长的话那么就更新结果。属于动态规划算法。这个算法的事件复杂度是 O(n 的平方)时间复杂度较高在 leetcode 上运行时会超时。class Solution { public: string longestPalindrome(string s) { int size s.size(); for (int i 0; i size; i) { for (int j i; j size; j) { if (isPalindrome(s.substr(i, j - i 1))) { if (j - i 1 max_length) { max_length j - i 1; max_str s.substr(i, j - i 1); } } } } return max_str; } private: bool isPalindrome(string s) { int size s.size(); int i 0; int j size - 1; while (i j) { if (s[i] ! s[j]) { return false; } i; j--; } return true; } private: int max_length 0; string max_str; };这个题目要找的是最长回文子串我们能想到 j 的遍历从大向小遍历。这样遍历的话就是先遍历长度大的字符串再遍历长度小的字符串。当第一个遍历到一个字符串是回文串那么这个回文串就是长度最大的回文串就可以直接返回。从小向大进行遍历当遍历到这个字符串是回文串的时候仍然不能返回因为不能确定这个字符串是不是长度最大的回文串需要将所有情况都遍历完毕才能确定最大的回文字符串。再进一步思考我们可以以子串的长度作为遍历的依据长度从大到小进行遍历。如下是使用c语言实现的算法。char ret[1001] {\0}; char* longestPalindrome(char* s) { int length strlen(s); if (length 1) { return s; } memset(ret, 0, 1001); for (int len length; len 1; len--) { for (int i 0; i length; i) { if (i len - 1 length) { break; } int start_index i; int end_index i len - 1; if (isPalindrome(s, start_index, end_index)) { int index 0; for (int i start_index; i end_index; i) { ret[index] s[i]; index; } return ret; } } } return NULL; } int isPalindrome(char *s, int start_index, int end_index) { while (start_index end_index) { if (s[start_index] ! s[end_index]) { return 0; } start_index; end_index--; } return 1; }官方题解中也是遍历了子串的长度但是是从小到大进行遍历的同时还记录了已经遍历过的子串的结果。当判断长度较大的字符串是不是回文串时可以直接基于历史记录来做判断。这也是动态规划常用的思路就是在遍历的过程中记录历史信息这样在后边的遍历中可以直接使用已经记录的历史信息。官方题解中正因为长度是从小到大进行遍历的所以在遍历的时候判断字符串是不是回文串的时候可以使用历史信息进行判断。因为 s[i][j] 比 s[i 1][j - 1] 的长度要大后者是不是回文串已经是确定的。2.2 中心扩展法leetcode 官方题解中提供了另外一种方法中心扩展法。这个问题的多种算法之间的区别就是遍历的对象不一样1两级遍历遍历字符串的索引2两级遍历一级遍历子串的长度一级遍历字符串的索引3中心扩展法也是遍历字符串的索引不过在计算逻辑上是把索引当成了要遍历的子串的中心class Solution { public: string longestPalindrome(string s) { int size s.size(); int start 0; int end 0; for (int i 0; i size; i) { int left1 i; int right1 i; int left2 i; int right2 i 1; // 从中心向两边扩展要考虑两种情况 // 奇数的情况偶数的情况 centerExpand(s, left1, right1); centerExpand(s, left2, right2); 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); } void centerExpand(string s, int left, int right) { while (left 0 right s.size() s[left] s[right]) { left--; right; } // 循环退出说明最后一个索引不满足回文串的情况 // 要么是 left 和 right 越界了要么是当前这两个字符不相等 // 这两种情况下left 需要 , right 需要 -- left; right--; } };3 分割回文子串leetcode分割回文子串本文用基础的算法去思考的话很难思考下去遇到这种情况一般要考是不是可以使用递归算法。第一个想出这种解法的人绝对值得敬佩。class Solution { public: vectorvectorstring partition(string s) { partitionHelper(s, 0); return result_; } void partitionHelper(const string s, int start_index) { int len s.size(); if (start_index len) { result_.push_back(one_instance_); return; } for (int i start_index; i len; i) { if (isPalindome(s, start_index, i)) { one_instance_.push_back(s.substr(start_index, i - start_index 1)); partitionHelper(s, i 1); one_instance_.pop_back(); } } } bool isPalindome(const string s, int start, int end) { if (start end) { return true; } if (flag[start][end] 1) { return true; } if (flag[start][end] -1) { return false; } int tmp_start start; int tmp_end end; while (tmp_start tmp_end) { if (s[tmp_start] ! s[tmp_end]) { flag[tmp_start][tmp_end] -1; flag[start][end] -1; return false; } tmp_start; tmp_end--; } flag[start][end] 1; return true; } private: int flag[20][20] {0}; vectorvectorstring result_; vectorstring one_instance_; };

相关新闻

训练中途写盘拖垮吞吐:异步保存策略让AMD Instinct多扛47%批量

训练中途写盘拖垮吞吐:异步保存策略让AMD Instinct多扛47%批量

AMD Instinct MI250 集群大模型训练中的异步Checkpoint优化实战 问题背景与现象分析 在大型语言模型训练过程中,checkpoint保存是一个至关重要但又容易被忽视的性能瓶颈点。我们团队在使用8卡AMD Instinct MI250集群训练7B参数模型时,发现了一个严重影…

2026/8/3 19:49:18 阅读更多 →
凌晨3点的告警把我叫醒:CodeWhisperer生成的Lambda函数竟漏了CloudWatch日志权限

凌晨3点的告警把我叫醒:CodeWhisperer生成的Lambda函数竟漏了CloudWatch日志权限

从Lambda失联到Serverless架构:CodeWhisperer课程带来的蜕变 序言:一场本可避免的运维事故 那天凌晨3点17分,我被手机警报惊醒。部署仅一周的天气数据抓取Lambda函数突然失联,CloudWatch控制台里一片空白。这个本应每天定时运行…

2026/8/3 19:49:18 阅读更多 →
模型上线首日OOM崩溃:排查6小时后我发现是PyTorch加载方式埋的雷

模型上线首日OOM崩溃:排查6小时后我发现是PyTorch加载方式埋的雷

从深夜救火到系统防御:我的SageMaker模型部署优化全记录 凌晨2点收到报警短信时,我的咖啡杯直接打翻在键盘上——白天刚部署的推荐模型在流量高峰时OOM崩溃,SageMaker endpoint的监控面板一片飘红。这已经是本季度第三次因模型部署问题导致的…

2026/8/3 19:49:18 阅读更多 →

最新新闻

Unity TextMeshPro文本框自适应终极指南:告别布局错乱

Unity TextMeshPro文本框自适应终极指南:告别布局错乱

1. 项目概述:一个UI新手的“自适应”之痛刚接触Unity UI开发那会儿,TextMeshPro的文本框自适应问题,简直是我的噩梦。我记得特别清楚,当时在做一个小型信息展示面板,里面需要动态显示不同长度的玩家昵称和成就描述。我…

2026/8/3 20:32:53 阅读更多 →
Pandas数据筛选实战:isin、query、contains、loc、iloc核心用法详解

Pandas数据筛选实战:isin、query、contains、loc、iloc核心用法详解

1. 项目概述:数据筛选的“瑞士军刀” 在数据分析的日常工作中,我们面对的数据集往往不是“纯净”的,里面混杂着大量无关或需要特别关注的行列。想象一下,你手头有一份包含全国所有门店销售记录的Excel表格,老板突然让你…

2026/8/3 20:32:53 阅读更多 →
运算符、逻辑语句

运算符、逻辑语句

运算&逻辑: 运算符: 算术运算符 - * / % 一个浮点与整数运算时的结果还是浮点数 一个整数除另一个整数的结果还是整数 整除 注意不同类型数据的常规类型 赋值运算符 - * / % –赋值: 将右边的值赋值给左边的变量名 比较运算符 !…

2026/8/3 20:32:53 阅读更多 →
终极游戏时间统计指南:3分钟掌握Hydra Launcher的时长管理

终极游戏时间统计指南:3分钟掌握Hydra Launcher的时长管理

终极游戏时间统计指南:3分钟掌握Hydra Launcher的时长管理 【免费下载链接】hydra Hydra Launcher is an open-source gaming platform created to be the single tool that you need 项目地址: https://gitcode.com/GitHub_Trending/hy/hydra 还在为记不住自…

2026/8/3 20:32:53 阅读更多 →
Cocos2d-x网络资源加载优化:从原理到高性能方案实战

Cocos2d-x网络资源加载优化:从原理到高性能方案实战

1. 项目概述:为什么网络资源加载是游戏开发的“咽喉要道” 做游戏开发,尤其是用Cocos2d-x这类引擎,大家平时聊得最多的可能是渲染优化、物理碰撞或者酷炫的粒子效果。但在我十多年的项目经验里,有一个环节虽然不起眼,却…

2026/8/3 20:32:53 阅读更多 →
随机变量的方差

随机变量的方差

随机变量的方差 平均绝对偏差 E{∣X−E(X)∣}E\{ |X - E(X)| \} E{∣X−E(X)∣} 能够度量随机变量与其均值E(X)E(X)E(X)的偏离程度。但由于绝对值运算不方便,通常用平方偏差的期望 E{[X−E(X)]2}E\{ [X - E(X)]^2 \} E{[X−E(X)]2} 来度量随机变量XXX与其均值E(X…

2026/8/3 20:31:53 阅读更多 →

日新闻

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:47 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →