回文检测器

输入词语或句子,检测它是否正着读和倒着读都一样,并显示用于比较的整理后文字与倒序结果。

一览

回文是正着读和倒着读完全相同的词语、句子或数字。文字游戏、编程练习题、起名字和品牌名、数字谜题,都会用到“前后是否相同”的判断。本检测器会去掉空格、标点和大小写,把剩下的字符倒序后与原文比较。因为同时显示整理后的文字、倒序结果和第一处不同的位置,您看到的不只是“是”或“不是”,还能看到原因。

判断步骤

  1. 先把输入统一为Unicode的NFC形式,这样带附加符号的字母无论怎样输入都按同一个字符处理。
  2. 把英文字母全部转为小写。
  3. 只保留文字(汉字、假名、字母等任何文字体系)和数字,删除空格、标点、符号和表情符号。
  4. 把剩下的字符倒序,与原来的顺序完全一致就是回文。

共n个字符时,只需比较对称位置的组合:第1个与第n个,第2个与第n-1个,依此类推;长度为奇数时正中间那个字符不需要对应。例如“我爱妈妈爱我”共6个字,比较我-我、爱-爱、妈-妈三组即可确定。结果框中的“第一处不同”,就是从外向内逐组比较时最先出现差异的那一组。

示例判定表

下表是生成页面时,用与上方工具相同的规则计算出来的结果。

输入整理后的文字字数倒序结果判定
上海自来水来自海上上海自来水来自海上9上海自来水来自海上是回文
人人为我,我为人人人人为我我为人人8人人为我我为人人是回文
我爱妈妈爱我我爱妈妈爱我6我爱妈妈爱我是回文
人人为我,我為人人人人为我我為人人8人人為我我为人人不是回文
你好吗你好吗3吗好你不是回文
levellevel5level是回文
A man, a plan, a canal: Panamaamanaplanacanalpanama21amanaplanacanalpanama是回文
1232112321512321是回文
1234512345554321不是回文

“人人为我,我为人人”去掉逗号后正反读相同。第四行故意把后半句的“为”写成了繁体“為”,由于简体“为”和繁体“為”是两个不同的字符,结果就不是回文。可见本工具比较的是书写出来的字符,不是读音,也不做简繁转换。

数字回文有多少个

d位数只要决定了前半部分(向上取整的位数),后半部分就由镜像确定。首位有1~9共9种选择,前半部分其余每位各有10种,所以个数为 9×10⌈d/2⌉-1。下表可以对比公式值与逐个检查所有数得到的数值。

位数公式 9×10^(⌈d/2⌉-1)逐个检查
1位9个9个
2位9个9个
3位90个90个
4位90个90个
5位900个900个

验算示例:倒序相加

把一个数与它的倒序数相加,并重复这个过程,很多数最终会变成回文。56 的过程是 56 → 121,1步就成了回文;89 要经过 24 步,到 8813200023188 才成为回文。十进制下是否存在永远无法通过这种方式变成回文的数,目前没有被证明,196 常被当作候选。您也可以把中间结果输入本检测器验证。

自己编程实现时的要点

写回文判断程序时最容易出错的不是算法,而是预处理。不统一大小写,“Level”就会失败;不去掉空格和标点,句子类的回文全都会失败。另外,有些字符在内部占用不止一个单位,简单地把字符串整体倒过来可能把字符拆坏。本工具先把文本变成逐个字符的数组再比较,避免了这个问题。时间复杂度与字数成正比,只比较对称的字符对时比较次数是字数的一半。

常见误区与局限

如何利用结果

如果提示不是回文,请看“第一处不同”一行,它指出了哪一对字符不一致,也就是需要修改的地方。想自己造回文,可以从中间开始向两侧各加相同的字。做编程练习的话,从两端向中间比较的双指针写法,比把整个字符串倒过来更省内存。需要统计字数可以用字数统计 & 词数统计,需要先统一大小写可以配合文本大小写/命名格式转换器。

相关工具

使用示例

比如想为口令或笔名找一个左右对称的短语,可以输入“上海自来水来自海上”这样的句子,查看字数和倒序结果,一眼就能确认是否对称。测试长句时,逗号和空格可以原样粘贴,不需要自己先删掉。数字方面,像“20211202”这样的日期数字串,去掉分隔符后输入同样可以判断。在输入框按回车键也能触发检测,但在中文输入法选字、组词的过程中按回车不会触发,请先完成输入再按一次回车。检测结果可以用“复制结果”按钮整理成一行文字带走,方便贴到笔记或聊天里。

常见问题

数字也能判断是否为回文吗?

可以。像12321这样只由数字组成的输入,按同样的方法判断;字母和数字混合的输入也可以。

有空格或标点就不是回文吗?

不是。空格、标点和大小写会先被去掉,只比较纯粹的文字和数字,所以“A man a plan a canal Panama”这样带空格的句子也会被判为回文,中文句子里的逗号、句号同样会被忽略。

只输入一个字会怎样?

一个字符正反相同,会被判为回文,但从文字游戏的角度看没有意义。

简体字和繁体字能互相比较吗?

不能。工具比较的是字符本身,不做简繁转换。如需比较,请先把整句统一为简体或繁体再输入。

日语或英语也能检测吗?

可以。汉字、假名、字母等能被识别为文字的字符都会逐个比较,依据的是字符排列而不是发音。