【发布时间】:2018-02-26 23:56:18
【问题描述】:
按照Find string to regular expression programmatically?,我们假设找到匹配正则表达式的字符串需要线性时间。我的直觉说我们也可以通过编程方式解决正则表达式填字游戏,对吧?
如果是,解决 NxM 正则表达式填字游戏的时间复杂度是多少?
例子:
【问题讨论】:
标签: regex string algorithm performance time-complexity
按照Find string to regular expression programmatically?,我们假设找到匹配正则表达式的字符串需要线性时间。我的直觉说我们也可以通过编程方式解决正则表达式填字游戏,对吧?
如果是,解决 NxM 正则表达式填字游戏的时间复杂度是多少?
例子:
【问题讨论】:
标签: regex string algorithm performance time-complexity
即使您不允许反向引用,这也是 NP 难题。从exact set cover problem 到这个问题有一个简单的映射。
如果您有集合S[1], S[2], ..., S[n](与联合S),并且不失一般性,集合包含所有数字1...N 用于某些N。将S[i] 表示为长度为N 的字符串, 如果 k 在 S[i] 中,则 1 在第 k 位,否则 0。
让你的正则表达式拼图的列都一样——0*10*,第 k 行是“(S[k])|(0*)”。
例如,如果S[1] = {1, 4}, S[2] = {2}, S[3] = {3} 和S[4] = {2, 3},那么拼图将是:
0*10* 0*10* 0*10* 0*10*
1001|0*
0100|0*
0010|0*
0110|0*
这个正则表达式难题的解决方案是用 S[i] 精确覆盖 {1, 2, 3, 4}。
【讨论】:
\1 和 \2 不是正则表达式的一部分,尽管某些实现允许它们。通常,确定带有反向引用的正则表达式是否与字符串匹配需要指数时间。