在bidrectionally中替换字符串中的子字符串

时间:2015-07-19 21:26:37

标签: string algorithm

如果字符串 M 包含术语 A B ,我想用每个 A 代替 B 和每个 B A M'。天真的人会尝试用 B 替换 A ,然后用 A 替换 B ,但在这种情况下 M'仅包含 A 。我可以考虑更换条款并记录其位置,以便不再重新替换这些条款。当我们只有A和B来替换时,这种方法有效。但是如果我们需要替换超过2个术语并且它们的长度不同那么它就变得棘手了。

所以我想这样做:

  • 我们将 M 作为输入字符串,并将R = [(x1,y1),(x2,y2),...(xn,yn)]作为要替换的术语,我们将替换xi for yi for all i。
  • 使用 M ,Initiate L = [(M,false)]为(string * boolean)元组的列表,其中false表示此字符串尚未被替换。
  • 在L的每个成员L(i)中搜索xi的出现,第二项为false。将L(i)分区为[(pre,false),(xi,false),(post,false)],并映射到[(pre,false),(yi,true),(post,false)]其中pre和post是xi之前和之后的字符串。 Flatten L。
  • 重复上述步骤直至R耗尽。
  • 将每个L元组的第一个元素连接到 M'

有更有效的方法吗?

2 个答案:

答案 0 :(得分:0)

这是一个正则表达式解决方案:

var M = 'foobazbar123foo match';

var pairs = {
  'foo': 'bar',
  'bar': 'foo',
  'baz': 'quz',
  'no': 'match'
};

var re = new RegExp(Object.keys(pairs).join('|'),'g');

alert(M.replace(re, function(m) { return pairs[m]; }));

  

注意:这是演示/ POC。一个真正的实现必须处理查找字符串的正确转义。

答案 1 :(得分:0)

另一种方法是用中间临时字符串(符号)替换字符串,然后用原始对应符号替换符号。因此,转化def blah(): return 1 blah() 可以分两步进行转换,例如'foo' => 'bar'。然后,其他转化'foo' => '___1' => 'bar'将成为'bar' ==> 'foo'。这样可以防止您描述的混淆。

与其他答案相同的示例的示例python代码如下:

'bar' ==> '___2' ==> 'foo'