回文检测怎么做:从 level 到上海自来水来自海上
回文就是正着读和倒着读一样的字符串。这篇讲清楚中英文回文怎么判、为什么要忽略空格标点和大小写、回文数怎么算,以及最长回文子串这道编程练习题。
回文检测怎么做:从 level 到上海自来水来自海上
回文是个很朴素的概念:一段文字,正着读和倒着读完全一样。英文里 level、noon、racecar 都是回文,中文里「上海自来水来自海上」也是回文。判断它本身不难,难的是边界:空格算不算,标点算不算,大小写要不要区分,中文按字还是按字节比。这些细节没想清楚,代码就会在某条输入上翻车。我把这些年踩过的点整理了一下,顺便记一道经典的编程练习。
回文的定义:正读反读相同
最严格的定义是逐字符对称:第一个字符等于最后一个,第二个等于倒数第二个,一直到中间。level 满足,l=l、e=e、中间是 v,所以它是回文。hello 不满足,首字符 h 不等于尾字符 o,第一步就出局。
单个字符算回文,因为它和自己的倒序相同。空字符串和只有空格的输入,有些教科书把空串当作平凡回文,但实际用起来,在那里给一个「是」只会美化垃圾输入,所以我倾向于判它不是回文。
中文回文:必须按字符,不能按字节
「上海自来水来自海上」是流传很广的中文回文,倒过来读一字不差。可一旦你的代码按字节比较,就会判错:一个汉字在 UTF-8 里占三个字节,反转字节会把每个字的三字节也颠倒,得到的根本不是合法文字。
正确做法是按 Unicode 码点比较,把每个汉字当一个单位。这样带音标的拉丁字母整个保留,emoji 不会被从中间劈开,日文、韩文、阿拉伯文也都用同一套逻辑判断。中文还有更长的回文对联,比如「客上天然居居然天上客」,同样按字符比较就能确认对称。
忽略空格、标点、大小写
英文里最有名的回文句是「A man, a plan, a canal: Panama」。它逐字符看并不对称,因为有逗号、冒号、空格和大写。但只要先去掉空格和标点、再统一转小写,剩下 amanaplanacanalpanama,左右就完全镜像了。
所以一个好用的回文检测,默认应该忽略大小写、忽略空格和标点。这也是「Was it a car or a cat I saw」能被判为回文的原因。但这两个开关要能关掉:当你校验的是一个精确的 token 而不是念一句话时,大写 R 就不该等于小写 r,这时严格的逐字符比较才对。
回文数:数字也能回文
回文不只属于文字。回文数是正读反读相同的整数,比如 121、1331、9。它常出现在编程题里:给定范围找出所有回文数,或判断某个数是不是回文。
判断方法有两种。一种把数字转成字符串,直接和它的倒序比;另一种纯数学,逐位取出末位拼成反转数,再和原数比是否相等。后者不用额外的字符串内存,面试官有时会专门要求这种解法。要注意负数通常不算回文,因为负号反转后会跑到末尾。
真实例子:输入和输出
拿回文检测器实际跑两个例子最直观:
- 输入
level,默认规则,输出:是回文。它正反都读作 level。 - 输入
上海自来水来自海上,输出:是回文。九个字按码点对称。 - 输入
Almost a palindrome,即便忽略空格标点,剩下almostapalindrome也不对称,输出:不是回文。
我自己最常用它收尾一场争论。有人拍胸脯说自己那句话是回文,我直接粘进去,判定一秒钟就出来,省得对着字符一个个数。后来连刷算法题对答案也靠它,比手算可靠多了。
编程练习:最长回文子串
「最长回文子串」是白板面试的常客:在一个字符串里,找出本身是回文、长度最长的那段连续字符。babad 的答案是 bab(bab 和 aba 长度相同,一般取靠左的那个),cbbd 的答案是 bb,xracecary 的答案是 racecar。
主流解法是中心扩展法:遍历每个位置,把它当回文中心向两侧扩,分别处理奇数长度(单字符中心)和偶数长度(两字符中心),记录最长的那段。时间复杂度 O(n²),空间 O(1),写起来比动态规划简洁。还有更快的 Manacher 算法能做到 O(n),但面试里中心扩展通常就够了。
练这道题时有个小坑:子串查找应该在原始字符串上按字面工作,这样高亮出来的那段才能和你输入的对齐。所以 AbcbA 返回的是 bcb 而不是整串,这是有意为之,不是 bug。
想直接判断或练手,可以用 回文检测器,它会给出是否回文的判定,并就地高亮最长回文子串。如果你只是想看一段文字倒过来长什么样,顺手对照,反转文本工具更直接。
回文这东西看着简单,真要写对得照顾到字符编码、空白标点和大小写三件事。把规则摆清楚,无论是 level 还是上海自来水来自海上,判定都不会出错。
Made by Toolora · Updated 2026-06-13