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

约 7 分钟阅读

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

回文 - 正读反读都一样

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

日语回文有英语中没有的特殊规则,即忽略浊音符号和半浊音符号的惯例。"竹やぶ焼けた"严格来说是"たけやぶやけた",可以构成回文;但像忽略浊音有无来判定回文的情况也被广泛接受。这种"宽松性"丰富了日语回文,但从日语文本基本规则的角度来看,也导致了回文判定标准的模糊。

世界上最长的回文作品是劳伦斯·莱文于 2002 年发表的英语回文小说,约 17,826 个单词(约 58,000 个字符)。日语方面,土屋耕一的回文集很有名,收录了长达数百个字符的回文。

回文判定算法 - 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!)示例有意义的单词数(英语)
3 个字符6 种cat → act, tac...通常 1-2 个
5 个字符120 种listen → silent, enlist...通常 2-5 个
7 个字符5,040 种anagram → ...通常 1-3 个
10 个字符3,628,800 种astronomer → moon starer极其罕见
15 个字符约 1.3 万亿种-几乎不可能

随着字符数增加,组合数呈爆炸式增长,但形成有意义单词的概率急剧下降。即使在英语中,找到 10 个字符以上的有意义变位词也极其困难。

编程中判定变位词最高效的方法是对两个字符串的字符进行排序后比较。"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 世纪左右,这首歌是兼具数学约束与文学之美的人类智慧遗产。

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

英语全字母句在打字练习和字体预览中有实际用途。macOS 的字体预览显示"The quick brown fox jumps over the lazy dog",Windows 的字体列表也使用同一句话。这个包含全部 26 个字母的句子,是设计师一次性确认字体所有字符外观的最短样本,是不可或缺的工具。

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

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

避字文(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")自然就是双向图。

"SWIMS"是特别著名的双向图,旋转 180 度后仍然读作"SWIMS"。双向图艺术家约翰·兰登建立了将任意单词绘制为双向图的书法技法,并为丹·布朗的小说设计了封面。字符数越少,双向图设计越容易,但创作长单词或句子的双向图是需要高超设计技巧的艺术挑战。

数字回文与数学 - 196 问题

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

然而,对数字 196 执行此操作,经过数百万次重复计算也未能得到回文数。这就是被称为"196 问题"(196 conjecture)的未解决问题。截至 2023 年,计算已推进到超过 10 亿位,但仍未找到回文数。这个字符数(位数)不断增长的问题,象征着回文这一简单概念所蕴含的数学深度。

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

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

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

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

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

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

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

文字游戏和数学谜题的相关书籍也可以在 Amazon 上找到

分享这篇文章