【发布时间】:2020-02-22 20:30:36
【问题描述】:
假设我有一个字符串列表 {"boy", "car", "ball"} 和一个文本“the boy sell his car to buy a ball”。
给定另一个字符串列表 {"dog", "bar", "bone"},我的目标是找到文本中第一个列表的所有匹配项,并将它们交换为第二个列表的字符串:
BEFORE: the [boy] sold his [car] to buy a [ball]
AFTER: the [dog] sold his [bar] to buy a [bone]
我的第一个想法是使用正则表达式,但我不知道如何将字符串列表关联到正则表达式,我不想写 Aho-Corasick。
这样做的正确方法是什么?
另一个例子:
Text: aaa bbb abab aabb bbaa ubab
replacing {aa, bb, ab, ub} for {11, 22, 35, &x}
BEFORE: [aa]a [bb]b [ab][ab] [aa][bb] [bb][aa] [ub][ab]
AFTER: [11]a [22]b [35][35] [11][22] [22][11] [&x][35]
【问题讨论】:
-
你能简单地替换第一个目标字符串,然后是第二个,然后是第三个吗?你在优化性能吗?如果是这样,您会收到多少个字符串,它们可以有多长?
-
我想采用 O(n) 方法。上面的例子很简单,但是文本可以很大,字符串列表也可以,而且它们可能会重复很多。
-
如果是这样,我认为(但不确定)后缀树可以在 O(n) 中做到这一点,其中 n 是所有字符串的总长度。
标签: c# regex string-matching