当前位置: 首页 > article >正文

LeetCode 409:最长回文串 | 哈希表统计字符频率

LeetCode 409最长回文串 | 哈希表统计字符频率引言最长回文串Longest Palindrome是 LeetCode 第 409 题难度为 Easy。题目要求在给定字符串中构造最长的回文串返回其长度。这道题虽然简单但蕴含了回文串构造的核心原理对出现偶数次的字符可以全部放入回文串出现奇数次的字符最多只能取其偶数部分而多余的奇数字符可以放在回文串的中间位置。哈希表在这个问题中用于统计每个字符出现的次数。基于统计结果我们可以计算出最长回文串的长度。这道题的扩展性很强可以推广到构造实际的回文串而不仅仅是计算长度。问题分析题目描述给定一个包含大写字母、小写字母和数字的字符串找到用这些字符能构造的最长回文串的长度。例如输入字符串 abccccdd可以构造的最长回文串是 dccbccd 或 bccdccb 等长度为 7dccbccd。回文串构造原理回文串的特点是左右对称。在构造回文串时对于每个字符如果出现偶数次这个字符可以完整地放在回文串的左右两侧。如果出现奇数次这个字符只能取其偶数部分如 5 次取 4 次多余的 1 次可以放在回文串的中间位置。因此最长回文串的长度计算公式为所有字符的偶数部分之和加上 1如果存在至少一个奇数次的字符用于放在中间更精确地说设每个字符的出现次数为 count_i则回文串的长度为sum(min(count_i, 2 * floor(count_i / 2)))即所有字符的偶数部分之和如果存在至少一个 count_i 为奇数加 1简化为sum(count_i // 2 * 2) (1 if any(count_i % 2 1) else 0)解决方案哈希表统计def longestPalindrome(s: str) - int: char_count {} for char in s: char_count[char] char_count.get(char, 0) 1 length 0 has_odd False for count in char_count.values(): if count % 2 0: length count else: length count - 1 has_odd True if has_odd: length 1 return length这段代码首先使用哈希表统计每个字符的出现次数。然后遍历所有计数累加偶数部分处理奇数部分最后根据是否有奇数以决定是否加 1。使用 Python 的 Counterfrom collections import Counter def longestPalindrome_counter(s: str) - int: count Counter(s) length 0 for c in count.values(): length c // 2 * 2 if length len(s): length 1 return length这个版本更简洁。首先累加每个字符的偶数部分c // 2 * 2。然后如果处理后的长度小于原字符串长度说明存在奇数次的字符可以在中间再加一个字符。优化版本def longestPalindrome_optimized(s: str) - int: odd_count sum(1 for c in set(s) if s.count(c) % 2 1) return len(s) if odd_count 0 else len(s) - odd_count 1这个优化版本利用了一个重要观察回文串的长度等于原字符串长度减去需要去掉的奇数字符数即多余的奇数部分再加上 1如果有奇数字符。具体来说对于每个出现奇数次的字符我们需要去掉 1 个字符如 5 次去掉 1 次剩 4 次需要去掉的总数 奇数字符的出现次数之和 - 奇数字符的种类数但更简单的计算方式是如果有奇数字符总长度 原长度 - 奇数字符种类数 1算法正确性证明关键引理对于任意字符如果其出现次数为 c可以用于构成回文串左半边或右半边的字符数为 floor(c / 2) * 2如果 c 是奇数剩余 1 个字符可用于放在回文串中间构造性证明我们可以构造一个具体的回文串来证明算法的最优性对于每个字符取 floor(c / 2) * 2 个字符将这些字符对半分到回文串的左右两侧。收集所有奇数字符多余的 1 个字符。将步骤 2 收集的字符最多一种如果多种任选一种放在回文串的中间。步骤 1 使用的字符总数就是回文串长度。这个构造证明了算法的上界是可达的因此算法是最优的。代码实现Python 实现def longestPalindrome(s: str) - int: char_count {} for char in s: char_count[char] char_count.get(char, 0) 1 length 0 odd_exists False for count in char_count.values(): if count % 2 0: length count else: length count - 1 odd_exists True if odd_exists: length 1 return lengthJava 实现public int longestPalindrome(String s) { int[] count new int[128]; for (char c : s.toCharArray()) { count[c]; } int length 0; boolean hasOdd false; for (int c : count) { if (c % 2 0) { length c; } else { length c - 1; hasOdd true; } } return hasOdd ? length 1 : length; }Java 实现中使用了固定大小的数组ASCII 字符集大小来代替哈希表可以稍微提升性能。复杂度分析时间复杂度时间复杂度为 O(n)其中 n 是字符串长度。我们需要遍历字符串一次来统计字符频率然后遍历字符集最多 128 或 256 个字符一次来计算长度。空间复杂度空间复杂度为 O(1) 或 O(n)取决于字符集大小。如果使用哈希表空间复杂度为 O(n)最坏情况下所有字符都不同如果使用固定大小的数组空间复杂度为 O(1)。边界情况处理空字符串当输入为空字符串时没有任何字符可以构成回文串应返回 0。代码正确处理了这种情况odd_exists 为 Falselength 为 0。全相同字符当所有字符相同时如 aaaa回文串长度等于字符串长度 4。所有字符都可以用于构成回文串。全不同字符当所有字符都不同时如 abc没有任何字符可以配对只能取一个字符放在中间回文串长度为 1。混合情况如 abccccdd字符频率为 a:1, b:1, c:4, d:2。偶数部分为 426加上 1因为有奇数字符 a 和 b总长度为 7。变种问题构造实际的回文串如果不仅要求长度还要求返回具体的回文串可以使用以下方法def longestPalindrome_construct(s: str) - str: from collections import Counter count Counter(s) left [] middle [] right [] for char, c in count.items(): if c % 2 0: left.extend([char] * (c // 2)) right.extend([char] * (c // 2)) else: left.extend([char] * (c // 2)) right.extend([char] * (c // 2)) middle.append(char) result .join(left) (middle[0] if middle else ) .join(reversed(right)) return result大小写敏感如果问题要求区分大小写处理方式与原问题相同只是字符集变大256 或更多。测试用例def test_longest_palindrome(): assert longestPalindrome(abccccdd) 7 assert longestPalindrome(a) 1 assert longestPalindrome(aa) 2 assert longestPalindrome(ab) 1 assert longestPalindrome(aba) 3 assert longestPalindrome(aabbcc) 6 assert longestPalindrome(aabbccd) 7 assert longestPalindrome() 0 assert longestPalindrome(AabB) 3 print(所有测试用例通过)实际应用场景最长回文串问题在现实中有很多应用。在文学创作中如果需要用给定的字符构造最长的回文诗句可以使用类似的算法。在密码学中某些算法需要构造对称结构。在游戏开发中如果需要生成镜像名称或对称的标识符。回文串的构造原理也是其他回文相关问题的基础如判断一个字符串是否能构成回文、添加最少的字符使字符串成为回文等。总结最长回文串问题虽然简单但蕴含了回文串构造的核心原理。哈希表用于统计字符频率然后基于统计结果计算最长回文串的长度。这个问题的关键洞察是偶数次的字符可以完整使用奇数次的字符只能使用其偶数部分多余的奇数部分可以放在回文串中间。这个问题也展示了如何将一个看似复杂的问题如构造回文串简化为一个简单的计数问题。希望通过本文的讲解读者能够深入理解回文串的构造原理并将其应用到更多类似问题的解决中。

相关文章:

LeetCode 409:最长回文串 | 哈希表统计字符频率

LeetCode 409:最长回文串 | 哈希表统计字符频率 引言 最长回文串(Longest Palindrome)是 LeetCode 第 409 题,难度为 Easy。题目要求在给定字符串中构造最长的回文串,返回其长度。这道题虽然简单,但蕴含了回…...

LeetCode 380:O(1) 时间插入删除和获取随机元素 | 哈希表与数组的结合

LeetCode 380:O(1) 时间插入删除和获取随机元素 | 哈希表与数组的结合 引言 O(1) 时间插入删除和获取随机元素(Insert Delete GetRandom O(1))是 LeetCode 第 380 题,难度为 Medium。题目要求设计一个数据结构,支持在平…...

抖音内容高效管理方案:批量下载与智能文件组织

抖音内容高效管理方案:批量下载与智能文件组织 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音…...

数据可视化库对比:选择最适合你的工具

数据可视化库对比:选择最适合你的工具 前言 大家好,我是前端老炮儿。今天咱们来聊聊数据可视化库的选择! 在前端开发中,数据可视化是一个非常重要的领域。市面上有很多优秀的可视化库,比如ECharts、D3.js、Chart.js、T…...

深入理解Istio架构:控制平面与数据平面核心组件全解析

深入理解Istio架构:控制平面与数据平面核心组件全解析 【免费下载链接】istio-handbook Istio服务网格进阶实战 项目地址: https://gitcode.com/gh_mirrors/is/istio-handbook Istio作为新一代服务网格(Service Mesh)的领航者&#xf…...

地理数据可视化:地图绑定与空间分析

地理数据可视化:地图绑定与空间分析 前言 大家好,我是前端老炮儿。今天咱们来聊聊地理数据可视化! 地理数据可视化是数据可视化领域的一个重要分支,它可以帮助我们直观地展示和分析空间数据。无论是地图展示、区域分析还是位置追踪…...

CANN/pypto填充操作API

pypto.pad 【免费下载链接】pypto PyPTO(发音: pai p-t-o):Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atla…...

Three.js实战:3D数据可视化入门与实践

Three.js实战:3D数据可视化入门与实践 前言 大家好,我是前端老炮儿。今天咱们来聊聊Three.js! 在数据可视化领域,3D可视化正变得越来越重要。Three.js作为一个强大的3D库,可以帮助我们轻松创建各种3D效果。 今天我就带…...

城市交通网络信号的无模型自适应控制方法【附模型】

✨ 长期致力于城市交通网络信号控制、数据驱动控制、无模型自适应控制、无模型自适应预测控制、无模型自适应迭代学习控制、宏观基本图研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方…...

uView 2.0插件开发指南:如何扩展自定义组件与工具函数

uView 2.0插件开发指南:如何扩展自定义组件与工具函数 【免费下载链接】uView2.0 uView UI,是全面兼容nvue的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 项目地址: https://gitcode.com/gh_mirrors/uv/uVi…...

Stylis完全指南:掌握CSS嵌套、前缀和压缩的终极教程

Stylis完全指南:掌握CSS嵌套、前缀和压缩的终极教程 【免费下载链接】stylis light – weight css preprocessor 项目地址: https://gitcode.com/gh_mirrors/st/stylis Stylis是一款轻量级CSS预处理器,专注于提供高效的CSS嵌套、自动前缀添加和代…...

AI-Shoujo HF Patch完整安装教程:3步解锁游戏全部潜力

AI-Shoujo HF Patch完整安装教程:3步解锁游戏全部潜力 【免费下载链接】AI-HF_Patch Automatically translate, uncensor and update AI-Shoujo! 项目地址: https://gitcode.com/gh_mirrors/ai/AI-HF_Patch AI-Shoujo HF Patch是AI-Shoujo游戏玩家的必备增强…...

uView 2.0性能优化终极秘籍:按需引入与打包体积精简完整教程

uView 2.0性能优化终极秘籍:按需引入与打包体积精简完整教程 【免费下载链接】uView2.0 uView UI,是全面兼容nvue的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 项目地址: https://gitcode.com/gh_mirrors/…...

Windows系统Btrfs驱动终极指南:免费解锁Linux文件系统的强大功能

Windows系统Btrfs驱动终极指南:免费解锁Linux文件系统的强大功能 【免费下载链接】btrfs WinBtrfs - an open-source btrfs driver for Windows 项目地址: https://gitcode.com/gh_mirrors/bt/btrfs 想在Windows上体验Linux下一代文件系统的强大功能吗&#…...

3步解决微信红包难题:智能助手帮你告别手慢烦恼

3步解决微信红包难题:智能助手帮你告别手慢烦恼 【免费下载链接】WeChatLuckyMoney :money_with_wings: WeChats lucky money helper (微信抢红包插件) by Zhongyi Tong. An Android app that helps you snatch red packets in WeChat groups. 项目地址: https:/…...

乡村景区智慧垂钓破局增收!巨有科技激活乡村“渔乐”经济

垂钓作为国民级休闲活动,拥有超1.2亿爱好者,是乡村文旅中极具潜力的黄金业态。然而,多数乡村钓场仍停留在“一根竿、一个塘”的粗放运营阶段,面临计费混乱、管理成本高、体验同质化、增收乏力等困境。巨有科技聚焦乡村场景&#x…...

智能停车系统告别拥堵!巨有科技让景区停车畅行无忧

每逢节假日,景区停车场便成了“重灾区”——入口大排长龙、场内找位半小时、缴费排队苦不堪言。这不仅严重消耗游客耐心,更直接拉低景区口碑与运营效率。在文旅消费持续回暖的今天,停车体验已成为衡量景区服务力的关键指标。巨有科技以数据驱…...

免费开源鼠标连点器:5分钟上手跨平台自动化点击完整指南

免费开源鼠标连点器:5分钟上手跨平台自动化点击完整指南 【免费下载链接】MouseClick 🖱️ MouseClick 🖱️ 是一款功能强大的鼠标连点器和管理工具,采用 QT Widget 开发 ,具备跨平台兼容性 。软件界面美观 &#xff0…...

Windows热键冲突终极解决方案:Hotkey Detective帮你找回失窃的快捷键

Windows热键冲突终极解决方案:Hotkey Detective帮你找回失窃的快捷键 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective…...

原神帧率解锁终极指南:简单三步突破60FPS限制

原神帧率解锁终极指南:简单三步突破60FPS限制 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 原神帧率解锁工具是一款专门为《原神》PC玩家设计的开源工具,能够安…...

鸣潮自动化终极指南:5步实现后台智能挂机,解放你的游戏时间

鸣潮自动化终极指南:5步实现后台智能挂机,解放你的游戏时间 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves …...

防爆控制柜制造:从危险区域适配到电气安全的完整解析

一、什么是防爆控制柜制造?防爆控制柜制造,是指根据化工厂、石油化工、制药车间、喷涂车间、粉尘车间、油漆房、燃气站、危化品仓库、煤化工、粮食加工、木粉加工、新能源材料、电子化学品等存在爆炸性气体、蒸气或粉尘环境的场所需求,对防爆…...

非标系统控制柜制造:从特殊工况到定制控制的完整解析

一、什么是非标系统控制柜制造?非标系统控制柜制造,是指针对常规PLC控制柜、变频器控制柜、低压配电柜、防爆控制柜之外的特殊控制需求,根据设备工艺、现场环境、控制逻辑、通讯协议、安全要求和安装空间,对柜体结构、电气元件、控…...

3步快速上手:gmpublisher帮你轻松发布Garry‘s Mod工坊内容

3步快速上手:gmpublisher帮你轻松发布Garrys Mod工坊内容 【免费下载链接】gmpublisher ⚙️ Workshop Publishing Utility for Garrys Mod, written in Rust & Svelte and powered by Tauri 项目地址: https://gitcode.com/gh_mirrors/gm/gmpublisher 还…...

HarmonyOS 6 Chip 组件:不显示后缀图标使用文档

文章目录概述源码隐藏后缀图标核心实现原理1. 核心控制字段2. 双重隐藏条件3. 冗余回调说明组件配置解析总结概述 Chip组件后缀图标包含两类:系统默认关闭图标、自定义suffixIcon后缀图标。 通过组件配置项可统一关闭后缀图标展示,实现仅前缀图标文字的…...

如何将GIMP秒变Photoshop?GimpPs主题插件完整配置指南

如何将GIMP秒变Photoshop?GimpPs主题插件完整配置指南 【免费下载链接】GimpPs Gimp Theme to be more photoshop like 项目地址: https://gitcode.com/gh_mirrors/gi/GimpPs 如果你正在寻找一款能让GIMP拥有Photoshop般专业界面的主题插件,GimpP…...

中兴光猫工厂模式终极解锁工具:zteOnu完整指南

中兴光猫工厂模式终极解锁工具:zteOnu完整指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 你是否曾经因为中兴光猫的限制而感到束手无策?想要进行高级配置却…...

HarmonyOS 6 Chip 组件:设置默认后缀图标使用文档

文章目录代码默认后缀图标核心配置1. 启用默认关闭图标2. 显示优先级规则3. 关联配置项代码解析1. 启用默认后缀图标2. 不冲突条件3. 整体结构总结默认后缀图标即 Chip 内置关闭图标,由系统提供样式、尺寸、交互逻辑,无需配置图片资源,只需开…...

深度解析游戏资源加密机制:构建安全增强模块的完整实现

深度解析游戏资源加密机制:构建安全增强模块的完整实现 【免费下载链接】wuwa-mod Wuthering Waves pak mods 项目地址: https://gitcode.com/GitHub_Trending/wu/wuwa-mod WuWa-Mod作为《鸣潮》(Wuthering Waves)游戏模组开发项目,通过AES加密解…...

Android Studio中文界面全面配置指南:专业汉化解决方案

Android Studio中文界面全面配置指南:专业汉化解决方案 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack Android Studi…...