【C++经典例题】回文串判断:两种高效解法剖析

【C++经典例题】回文串判断:两种高效解法剖析
           💓 博客主页:倔强的石头的ZEEKLOG主页 

           📝Gitee主页:
倔强的石头的gitee主页

            ⏩ 文章专栏:C++经典例题

                                  期待您的关注



目录

一、问题描述

示例

二、解法一:将字母数字连接到新的 string

思路

代码实现

代码解释

复杂度分析

三、解法二:直接原地筛选判断

思路

代码实现

代码解释

复杂度分析

总结


一、问题描述

在字符串处理中,判断一个字符串是否为回文串是一个经典问题。

本题有特殊要求:在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,如果短语正着读和反着读都一样,则认为该短语是一个回文串。字母和数字都属于字母数字字符。

示例

  • 输入: s = "A man, a plan, a canal: Panama",输出:true,解释:处理后得到 "amanaplanacanalpanama" 是回文串。
  • 输入:s = "race a car",输出:false,解释:处理后得到 "raceacar" 不是回文串。
  • 输入:s = " ",输出:true,解释:移除非字母数字字符后,s 是一个空字符串 "",空字符串正着反着读都一样,所以是回文串。

 原题链接 

125. 验证回文串 - 力扣(LeetCode)

二、解法一:将字母数字连接到新的 string

思路

这种方法的核心思想是先遍历原字符串,把其中的字母数字字符提取出来,同时将大写字母转换为小写字母,存储到一个新的字符串 tmp 中

然后再对新字符串 tmp 进行回文判断

代码实现

#include <iostream> #include <string> class Solution { public: bool isPalindrome(string s) //第一种方式 将字母数字连接到新的string { string tmp; string::iterator left = s.begin(); string::iterator right = s.end(); while (left != right)//第一次遍历,所有字母数字转入新string,并且统一为小写 { if ((*left >= '0' && *left <= '9') || (*left >= 'a' && *left <= 'z')) tmp += *left; if (*left >= 'A' && *left <= 'Z') tmp += (*left + 32); ++left; } if (tmp.empty())//如果新string为空,则判定为回文串 return true; left = tmp.begin(); right = tmp.end() - 1; while (left <= right)//第二次遍历 左右迭代器逐个对比 { if (*left == *right) { ++left; --right; } else return false; } return true; } }; 

代码解释

  1. 提取字母数字并转换大小写
    • 定义一个空字符串 tmp 用于存储处理后的字符。
    • 使用迭代器 left 遍历原字符串 s,当遇到数字('0' 到 '9')或小写字母('a' 到 'z')时,直接添加到 tmp 中;当遇到大写字母('A' 到 'Z')时,将其 ASCII 码值加 32 转换为小写字母后添加到 tmp 中。
  2. 处理空字符串情况:如果 tmp 为空字符串,根据题目定义,空字符串是回文串,直接返回 true
  3. 回文判断:使用双指针法,left 指向 tmp 的开头,right 指向 tmp 的结尾,逐个比较对应位置的字符。如果不相等,返回 false;如果都相等,最终返回 true

复杂度分析

  • 时间复杂度:O(n)需要遍历原字符串一次,再遍历新字符串一次。
  • 空间复杂度:O (n),其中  n是处理后新字符串的长度。

三、解法二:直接原地筛选判断

思路

这种方法不创建新的字符串,而是直接在原字符串上使用双指针法进行筛选和判断。通过两个指针 left 和 right 分别从字符串的两端开始向中间移动,跳过非字母数字字符,同时将字符转换为小写后进行比较。

代码实现

#include <iostream> #include <string> #include <cctype> class Solution { public: bool isPalindrome(std::string s) //第二种方式,直接原地筛选判断 { string::iterator left = s.begin(); string::iterator right = s.end() - 1; while (left < right) { // 跳过左边的非字母数字字符 while (left < right && !isalnum(*left)) { ++left; } // 跳过右边的非字母数字字符 while (left < right && !isalnum(*right)) { --right; } if (left < right) { // 将字符转换为小写后比较 if (tolower(*left) != tolower(*right)) { return false; } ++left; --right; } } //跳出循环,要么left==right,要么left>right //说明所有需要比较的字符对都已经检查过,且都相等 return true; } }; 

代码解释

  1. 初始化指针:使用迭代器 left 指向字符串的开头,right 指向字符串的结尾。
  2. 跳过非字母数字字符:通过两个内层 while 循环,分别将 left 和 right 指针移动到字母数字字符的位置。
  3. 字符比较:将 left 和 right 指针指向的字符转换为小写后进行比较,如果不相等,返回 false;如果相等,继续移动指针。
  4. 返回结果:当 left 大于等于 right 时,说明所有需要比较的字符对都已经检查过,且都相等,返回 true

复杂度分析

  • 时间复杂度:O(n),只需要遍历一次字符串。
  • 空间复杂度:O(1),只使用了常数级的额外空间。

总结

两种解法都能有效解决回文串判断问题:

解法一逻辑清晰,易于理解,但需要额外的空间存储处理后的字符串;

解法二原地操作,空间复杂度更低,更适合处理大规模数据。在实际应用中,可以根据具体需求选择合适的解法。

Read more

“现在的AI就像1880年的笨重工厂!”微软CSO斯坦福泼冷水:别急着造神

“现在的AI就像1880年的笨重工厂!”微软CSO斯坦福泼冷水:别急着造神

大模型仍未对上商业的齿轮? 编译 | 王启隆 来源 | youtu.be/aWqfH0aSGKI 出品丨AI 科技大本营(ID:rgznai100) 现在的硅谷,空气里都飘着一股“再不上车就晚了”的焦躁感。 最近 OpenClaw 风头正旺,强势登顶 GitHub,终结了 React 神话,许多人更是觉得“AI 自己干活赚钱”的日子就在明天了。 特别是在斯坦福商学院(GSB)这种地方,台下坐着的都是成天琢磨怎么用下一个技术风口搞个独角兽出来的狠人。 微软的首席科学官(CSO)Eric Horvitz 被请到了这个几乎全美最想用 AI 变现的礼堂里。作为从上世纪 80 年代就开始搞 AI 的绝对老炮、也是微软技术底座的“扫地僧”,这位老哥并没有顺着台下的胃口,去吹捧下个月大模型又要颠覆什么行业,而是兜头给大家浇了一盆带点学术味的冷水。 他讲了一个挺有画面感的比喻:大家都在聊

By Ne0inhk
Godot被AI代码“围攻”!维护者崩溃发声:“不知道还能坚持多久”

Godot被AI代码“围攻”!维护者崩溃发声:“不知道还能坚持多久”

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 当大模型能在几秒钟内生成一段“看起来像那么回事”的补丁时,开源社区却开始付出另一种代价。 最近,开源游戏引擎 Godot 的核心维护团队公开吐槽:他们正被大量“AI 生成的低质量代码”淹没。那些代码往往结构完整、注释齐全、描述洋洋洒洒,但真正的问题是——提交者可能并不理解自己交上来的内容。 这件事,并不是简单的“有人偷懒用 AI 写代码”。它正在触及开源协作最核心的东西:信任。 一场悄无声息的“AI 洪水” 事情的导火索来自一条 Bluesky 讨论帖。 Godot 主要维护者之一、同时也是 Godot 商业支持公司 W4 Games 联合创始人的 Rémi Verschelde 表示,所谓的“AI slop”

By Ne0inhk
诺奖得主辛顿最新访谈:1 万个 AI 可以瞬间共享同一份“灵魂”,这就是为什么人类注定被超越

诺奖得主辛顿最新访谈:1 万个 AI 可以瞬间共享同一份“灵魂”,这就是为什么人类注定被超越

当宇宙级的“嘴炮”遇到降维打击。 编译 | 王启隆 来源 | youtu.be/l6ZcFa8pybE 出品丨AI 科技大本营(ID:rgznai100) 打开最新一期知名播客 StarTalk 的 YouTube 评论区,最高赞的一条留言是这样写的: “我长这么大,第一次看到尼尔·德葛司·泰森(Neil deGrasse Tyson)在一档节目里几乎全程闭嘴,像个手足无措的小学生一样乖乖听讲。” 作为全美最知名的天体物理学家,泰森平时的画风是充满激情、喋喋不休、用宇宙的宏大来震撼嘉宾。但这一次,坐在他对面的那位满头银发、带着温和英音的英国老人,仅仅用最平淡的语气,就让整个演播室陷入了数次令人窒息的沉默。 这位老人是 Geoffrey Hinton。深度学习三巨头之一,2024 年诺贝尔物理学奖得主,被公认为“AI 教父”。 对经常阅读 Hinton 演讲的我来说,这也是比较新奇的一幕—

By Ne0inhk
48小时“烧光”56万!三人创业团队濒临破产,仅因Gemini API密钥被盗:“AI账单远超我们的银行余额”

48小时“烧光”56万!三人创业团队濒临破产,仅因Gemini API密钥被盗:“AI账单远超我们的银行余额”

整理 | 苏宓 出品 | ZEEKLOG(ID:ZEEKLOGnews) 「仅过了 48 小时,一笔 8.2 万美元的天价费用凭空出现,较这家小型初创公司的正常月费暴涨近 46000%。」 这不是假设的虚幻故事,而是一家墨西哥初创公司正在经历的真实危机。 近日,一位名为 RatonVaquero 的开发者在 Reddit 发帖求助称,由于他的 Gemini API 密钥被盗用,原本每月仅约 180 美元(约 1242 元)的费用,在短短 48 小时内暴涨到 82,314.44 美元(约 56.8 万元)。对于这家只有三名开发者的小型创业团队来说,这笔突如其来的账单,几乎等同于灭顶之灾。 “我现在整个人都处在震惊和恐慌之中。”RatonVaquero

By Ne0inhk