最后更新:

回文、双向图与变位词 - 字符数催生的文字游戏数学

约 7 分钟阅读

"shinbunshi"(报纸)倒过来读还是"shinbunshi"。这个简单游戏的背后,隐藏着组合论、计算复杂性理论以及语言结构方面的深层数学。回文、变位词、全字母句、避字文。通过对字符排列顺序和字符数施加约束而产生的这些文字游戏,既是编程竞赛的经典题目,也是密码学的基础,更是挑战人类语言能力极限的智力游戏。

回文 - 正读反读都一样

回文(palindrome)是指从前往后读和从后往前读都相同的文本。日语中"竹やぶ焼けた"(竹林烧了)、"トマト"(番茄)、"新聞紙"(报纸)等都是著名的例子。英语中"racecar""madam""A man, a plan, a canal: Panama!"是经典范例。

日语回文存在英语中没有的判定分歧,即浊音符号和半浊音符号的处理方式。当对称位置上出现"か"与"が"这样的清音、浊音配对时,忽略浊音符号的立场会把它们视为同一个字符而认定为回文,严格区分的立场则不予认可。经常被引用的"竹やぶ焼けた"改写成假名后是"たけやぶやけた",这 7 个字符本身就左右对称,因此不必依赖这种宽容也能成立。真正因标准不同而结果分歧的,是对称位置上浊音符号有无不一致的作品。这种"宽松性"拓宽了日语回文的表现幅度,但从日语文本基本规则的角度来看,如果不事先确定判定标准,同一部作品就既可能被算作回文也可能被算作非回文,这是个麻烦的问题。

回文并不限于短句,也有人写出全文都是回文的长篇小说。英语方面有两部作品广为人知:戴维·史蒂文斯的《Satire: Veritas》(1980 年、58,795 个字符),以及劳伦斯·莱文的《Dr Awkward & Olson in Oslo》(1986 年、31,954 个单词)。要在数万个单词的篇幅里始终保持整篇文本左右对称这一约束,此类作品的文意自然度往往要被牺牲,作为读物的可读性与约束的严苛程度会正面冲突。

回文判定算法 - O(n) 的优雅

在编程中,判定字符串是否为回文的算法是计算复杂性理论的理想入门题材。最简单的方法是将字符串反转后与原字符串比较,时间复杂度为 O(n),空间复杂度为 O(n)。

更高效的方法是在字符串两端各放一个指针,向中间逐字符比较。这种方法的时间复杂度为 O(n),空间复杂度为 O(1)。

Manacher 算法可以在 O(n) 时间内检测字符串中的所有回文子串。这个由格伦·马纳赫于 1975 年发表的算法,能高效计算以每个位置为中心的最长回文半径。其核心思想是利用之前计算过的回文的对称性,将朴素方法的 O(n²) 降低到 O(n)。

算法时间复杂度空间复杂度特点
字符串反转 + 比较O(n)O(n)实现最简单
双指针法O(n)O(1)无需额外内存
递归判定O(n)O(n)(栈)适合函数式编程
最长回文子串(Manacher)O(n)O(n)检测所有回文子串
回文分割(DP)O(n²)O(n²)求最小分割数

在编程竞赛(AtCoder、LeetCode 等)中,回文相关问题频繁出现。LeetCode 的"Longest Palindromic Substring"(最长回文子串)是面试题中的经典。正则表达式的字符数与设计中涉及的模式匹配知识也可以应用于回文检测。

日语回文判定需要额外的预处理:浊音和半浊音的规范化、长音符号"ー"的处理、拗音(如"きょ")是作为 1 个字符还是 2 个字符处理的判断。这些规则因回文社区而异,不存在统一标准。用程序判定日语回文时,需要明确定义采用哪套规则。

变位词 - 字符重排引发的组合爆炸

变位词(anagram)是将某个单词或句子的字符重新排列,组成另一个有意义的单词或句子的文字游戏。英语中著名的例子有"listen"和"silent"、"astronomer"和"moon starer"。日语中也有"とけい"(时钟)和"けいと"(毛线)这样先改写为平假名再重排就能得到另一个词的组合。

从 n 个字符的单词可以生成的变位词理论组合数为 n!(n 的阶乘)。但当相同字符出现多次时,需要去除重复。

字符数全部不同字符时(n!)示例每秒尝试 100 万种时的穷举时间
3 个字符6 种cat → act瞬间完成
6 个字符720 种listen → silent, enlist, tinsel瞬间完成
7 个字符5,040 种thicken → kitchen瞬间完成
10 个字符3,628,800 种astronomer → moon starer约 3.6 秒
15 个字符约 1.3 万亿种-约 15 天

表中"示例"一栏列出的 astronomer,由于"o"和"r"各出现两次,实际上能够区分开的排列是把 10 的阶乘除去重复后的 907,200 种。字符数增加时候选数量会以阶乘的速度膨胀,但词典中收录的词条数量并不会随之成比例增加。也就是说,词越长,"命中"的密度就越低,重排成单个单词的结果也越难找到。因此长词的变位词,通常采用像 astronomer → moon starer 那样展开为多词短语的形式来实现。

编程中判定变位词最高效的方法是对两个字符串的字符进行排序后比较。"listen"排序后为"eilnst","silent"排序后也是"eilnst",因此可以判定为变位词。这种方法的时间复杂度为 O(n log n)。更快的方法是统计每个字符的出现次数并比较,时间复杂度为 O(n)。

变位词与密码学的历史有着深厚的渊源。17 世纪的科学家们使用变位词来主张发现的优先权。伽利略将土星环的发现以变位词"smaismrmilmepoetaleumibunenugttauiras"的形式公布,后来揭示这是"Altissimum planetam tergeminum observavi"(我观察到最高的行星是三重的)的变位词。

全字母句 - 使用所有字母的挑战

全字母句(pangram)是至少使用字母表中每个字母一次的句子。英语中最著名的全字母句是"The quick brown fox jumps over the lazy dog",用 35 个字符(不含空格)包含了全部 26 个字母。

完美全字母句(perfect pangram)是每个字母恰好使用一次的句子。英语的完美全字母句必须恰好由 26 个字符组成,要构成有意义的句子极其困难。"Mr Jock, TV quiz PhD, bags few lynx"(26 个字符)虽然有些牵强,但是完美全字母句的一个例子。

日语拥有世界上最美的全字母句 - "伊吕波歌"。

"いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす"

这首歌使用了当时所有 47 个假名字符各一次,是完美全字母句,同时还是一首表达佛教无常观的有意义和歌。作者不明,成立时期也只能推定在 10 世纪末到 11 世纪中叶之间(现存最早的记载见于 1079 年的文献)。在作者姓名未能留下的情况下被传诵近千年,这首歌是兼具数学约束与文学之美的人类智慧遗产。

现代日语假名有 46 个字符("ゐ""ゑ"被废除,"ん"被添加),但伊吕波歌中不包含"ん"。许多人尝试用现代 46 个假名创作完美全字母句,但没有一首能媲美伊吕波歌的美感。约束越严格,满足它的作品价值就越高。

英语全字母句一直在打字练习和字体样本展示中有实际用途。其中"The quick brown fox jumps over the lazy dog"作为字体样本的经典句子流传最广。原因在于它在不含空格的 35 个字符里收进了全部 26 个字母,能够一眼比对字体中所有字母的形状。不过这句话中出现的大写字母只有开头的 T,其余大写字母以及数字、符号的形状都无法确认。实际挑选字体时,需要在这句话之外再配合包含数字和符号的样本一起使用。字符数的精简程度与可确认范围的广度,在这里同样是取舍关系。

全字母句类型语言字符数使用的字符集
The quick brown fox...英语35 个字符a-z(26 个字母,有重复)
Mr Jock, TV quiz PhD...英语26 个字符a-z(完美全字母句)
伊吕波歌日语47 个字符47 个假名(完美全字母句)
Portez ce vieux whisky...法语37 个字符a-z(26 个字母,有重复)

避字文 - 不使用特定字符的约束

避字文(lipogram)与全字母句相反,是完全不使用特定字符来写文章的约束。最著名的避字文作品是法国作家乔治·佩雷克于 1969 年发表的小说《La Disparition》(消失)。这部约 300 页的小说完全没有使用法语中最常用的字母"e"。

英语方面,欧内斯特·文森特·赖特于 1939 年发表的《Gadsby》很有名。整部约 50,000 个单词的小说没有使用"e"。英语文本中"e"的出现频率约为 12.7%,是最常用的字母,在排除它的情况下写出长篇小说,需要惊人的语言能力。

在绘文字字符数统计一文中介绍的 Unicode 世界里,可用字符超过 14 万个,避开特定字符本身很容易。但在自然语言有限的字符集中排除特定字符并写出有意义的文章,是与字符数约束不同维度的智力挑战。

双向图 - 旋转后仍可阅读的文字设计

双向图(ambigram)是将文字旋转 180 度或镜像后仍然可以阅读(作为相同或不同的单词)的设计。通过丹·布朗的小说《天使与魔鬼》而广为人知。

双向图不是纯粹的字符数问题,而是利用文字视觉对称性的设计。在英语大写字母中,"A""H""I""M""O""T""U""V""W""X""Y"是左右对称的,"H""I""N""O""S""X""Z"旋转 180 度后看上去仍是同一个形状。这里容易被忽略的一点是,要做出旋转后仍可阅读的单词,必须同时满足两个条件:一是"每个字母各自都能回到原来的形状",二是"排列顺序反转后仍然成词"。"NOON""SOS"由旋转对称的字母写成,而且词本身就是回文,所以不必额外加工设计也能满足条件。

"SWIMS"则是更进一步的例子。W 和 M 各自单独旋转 180 度时都无法回到原来的形状,但旋转后会变成彼此的形状。把 S、W、I、M、S 反转过来重读,得到的仍然是 S、W、I、M、S,因此这个词也能作为旋转对称来阅读。不只是寻找单独对称的字母,还要找出旋转后互相调换的字母配对,这才是双向图设计的关键所在。

开创这一表现形式的是平面设计师约翰·兰登(1946-2026 年)。他在 1972 年把"heaven"绘成了"倒过来也能读的词",与另行想到同样构思的斯科特·金并列为先驱者。而"双向图"(ambigram)这个名称本身,是道格拉斯·霍夫施塔特在 1984 年给出的。兰登为丹·布朗的小说《天使与魔鬼》创作了双向图,据说该作的主角罗伯特·兰登的设定也部分取材于他。字符数越少,双向图设计越容易,但创作长单词或句子的双向图是需要高超设计技巧的艺术挑战。

数字回文与数学 - 196 与利克瑞尔数

数字世界中也存在回文。121、1331、12321 等回文数(palindromic number)具有数学上有趣的性质。对任意自然数反复执行"将数字倒序后相加"的操作,很多情况下会得到回文数。例如:59 → 59 + 95 = 154 → 154 + 451 = 605 → 605 + 506 = 1111(回文数)。

然而,对数字 196 执行此操作,即使重复数百万次也得不到回文数。像这样被推测无论重复多少次都不会变成回文数的数,被称为"利克瑞尔数"(Lychrel number),196 是十进制下最小的候选。探索的历史相当漫长:1990 年经过约 242 万次迭代到达 100 万位,2006 年到达 3 亿位,2011 年经过 10 亿次迭代到达了 4 亿 1,393 万位的数,但回文数始终没有出现(截至 2026 年)。这里需要注意的是,迭代次数与位数是两回事。一次加法最多只让位数增加 1 位,因此"计算了 10 亿次"并不意味着"到达了 10 亿位"。而且位数无论延伸到多长,那也只停留在尚未找到反例这一事实上,并不能证明 196 真的是利克瑞尔数。仅靠不断数字符数(位数)无法为这个问题下定论,回文这一简单概念所蕴含的数学深度正体现在此处。

符号图 - 隐藏在非文字元素中的信息

作为文字游戏的一种,符号图(semagram)也值得一提。符号图不是在文字本身中,而是在文字的装饰或排版中隐藏信息。例如,在信件中将特定字符稍微加粗,或微妙地改变特定单词之间的间距来传递秘密信息。

在数字世界中,有研究通过操纵字体字距(字符间距)来嵌入比特信息。将正常字距设为"0",稍宽的字距设为"1",在整个文档中嵌入二进制数据。这种技术完全不改变字符数就能隐藏信息,因此无法通过字符计数来检测。

编程与文字游戏 - 字符数约束的实际应用

这些文字游戏不仅仅是智力娱乐。回文判定是字符串算法的基础,也应用于 DNA 序列分析(回文序列是限制性内切酶的识别位点)。变位词检测与哈希函数设计相关,全字母句用于字体预览显示("The quick brown fox..."出现在字体样本中正是因为这个原因)。

文字游戏字符约束计算复杂度实际应用
回文前后对称判定:O(n)DNA 序列分析、数据验证
变位词相同字符的重排判定:O(n log n)密码学、哈希函数
全字母句包含所有字符判定:O(n)字体预览、打字练习
避字文排除特定字符判定:O(n)文体分析、作者鉴定
双向图视觉对称性-标志设计、密码

用字符计数工具测量字符串的长度,是所有这些文字游戏的起点。回文的字符数是偶数还是奇数会改变中间字符的处理方式,变位词的字符数增加会引发组合爆炸,全字母句的约束条件取决于字符集的字符数。在计数字符这一简单行为的背后,展开着组合论与计算复杂性理论的广阔世界。

分享这篇文章