【发布时间】:2010-10-11 08:54:05
【问题描述】:
让我们举一个具体的例子,希望我能清楚。假设月份的(有序)列表:
一月
(代表月份的整数,从零开始),这样
一月是 0,二月是 1,...,十二月是 11。
现在假设我无法访问月份的全名,并得到以下列表,其中月份已缩短为首字母,e 代表一个空类别,例如这个:
e, F, e, e, e
如果我建立一个“明确的月份”列表(f:1, s:8, o:9, n:10, d:11),我可以通过首先计算第一个类别(使用减法和 mod 12),然后从那里写下其余部分。但是,假设我得到了列表
e, A, e, e, J, e
然后我可以(直观地)计算出虽然 A 是模棱两可的(可能是四月或八月),但在这种情况下它只能是四月,因为八月没有任何 Js 在 2 个类别之后跟随它。一旦找到这个,我就可以再次从头计算一切。
最后,我的问题是:这个问题是否有解析解决方案(函数、算法),还是我唯一希望使用蛮力来定义每个潜在关系?对于某些示例,没有消歧算法/函数可以工作:考虑我有一个 J 后跟 11 个 e 的情况,然后是一个 J em> 后跟 11 个 e ... 由于中间有一年,我无法将 J 区分为 1 月、6 月或 7 月。
答案:我最终编写了 Il-Bhima 的答案,因为特别是对于这种情况,正则表达式是可以的,即使在更高的运行时间 O(mn) 时也是如此。但是,我接受了 Ben 的答案作为正确答案,因为它包含了其他答案(提到了正则表达式解决方案),但也提出了使用 KMP 算法 O(m+n) 的更好方法,尽管这是针对更大数量的字符串匹配模式。谢谢大家。
【问题讨论】: