在许多语言中,有一个函数可以执行以下操作:
replace(string, pattern, replacement)
replace("aSb", "S", "ba")
=> "abab"
但有没有办法编写一个相反的函数?
derive_replacement(before_string, after_string)
derive_replacement("space ba ba space ba", "fact ba ba fact ba")
=> ("space", "fact")
我意识到有几种方法可以返回一条规则,让你从一个字符串到另一个字符串,但我正在寻找最短的一个。例如,以下两个技术都可以工作,但找不到最短的字符串:
derive(before, after) {
return (before, after)
}
derive(before, after) {
first_diff = len(commonprefix(before, after))
last_diff = len(commonsuffix(before, after))
return (before[first_diff:len(before) - last_diff],
after[first_diff:len(after) - last_diff])
}
我正在寻找一种通用的方法来做到这一点,但如果它有所帮助,我试图让它在Haskell中运行。但是,任何语言甚至伪代码都足够了。
答案 0 :(得分:1)
这不是一个简单的问题。
在某些情况下,您的第二个示例将提供错误的结果。考虑如果你打电话
会发生什么派生(" foo foo foo"," foo baz foo")。
显然,蛮力方法是可能的,例如(在类似cued的伪代码中)
if (before==after) return "",""
for (pl=1;pl<(len(before)-1);pl++) {
for (ps=0;ps<=len(before)-pl;ps++) {
for (rl=1;rl<len(after)-ps;rl++) {
pattern=substr(before,ps,pl);
replacement=substr(after,ps,rl);
if (replace(before,pattern,replacement) == after) {
return(pattern,replacement);
}
}
}
}
return (before,after);
我不知道是否有更有效的解决方案。