我会用贪心算法接近它运行。类似这样的:
// warning, untested
public String Translate(String s, Dictionary<String, String> mapping)
{
String result = "";
if (RecurTranslate(s, mapping, ref result))
return result;
throw new Exception("No translation");
}
private bool RecurTranslate(String s, Dictionary<String, String> mapping, ref String result)
{
if (s.Length == 0)
return true;
for (int prefixLen = s.Length; prefixLen > 0; --prefixLen)
{
String prefix = s.Substring(0, prefixLen);
String trans;
if (mapping.TryGetValue(prefix, out trans))
{
if (RecurTranslate(s.Substring(prefixLen), mapping, ref result))
{
result = trans + result;
return true;
}
}
else if (prefixLen == 1)
{ // this branch allows a character to stand for itself
if (RecurTranslate(s.Substring(prefixLen), mapping, ref result))
{
result = prefix + result;
return true;
}
}
}
return false;
}
这从前面开始,寻找最大可能的匹配。根据数据,其他方法可能会更好 - 比如,通过映射将在长度为了找到从那里最长匹配和拆分:
private bool RecurTranslate2(String s, Dictionary<String, String> mapping, ref String result)
{
if (s.Length == 0)
return true;
foreach (var entry in mapping.Where(e => e.Key.Length <= s.Length).OrderByDescending(e => e.Key.Length))
{
if (s.Contains(entry.Key))
{ // split into a before and after
int idx = s.IndexOf(entry.Key);
String before = s.Substring(0, idx);
String after = s.Substring(idx + entry.Key.Length);
String bRes = "", aRes = "";
if (RecurTranslate2(before, mapping, ref bRes) && RecurTranslate2(after, mapping, ref aRes))
{
result = aRes + entry.Value + bRes;
return true;
}
}
}
return false;
}
最后,你可能会结合这些方法玩法:用RecurTranslate2直到你达到一定的长度阈值,然后切换到RecurTranslate。
回应的评论:对于未能查找
我有点担心你的这种方法,假设有一个词“看着”,现在你的逻辑会发现在数据库中看到了,没有找到,比找不到它,现在它会寻找手表,这是发现,但这个手表是不一样的观看,我希望我已经表达了我的关注。 – 2012-07-24 09:19:17
我希望你确定你不会碰到这个映射的东西。例如。假设你在映射中有以下几项:CHA,CH,AR,T。看起来这足以翻译Chart。现在应用你的逻辑,我们可能会最终选择CHA,然后我们将没有R的选项。相反,我们可以选择CH,AR和T.我担心,如果你的数据库扩展到26个字母的数百个组合你可能最终会遇到这些冲突...我相信你一定会照顾这个...... – 2012-07-24 09:19:46
@ImranBalouch我认为它不喜欢他是否得到一个匹配的“看”他满意。如果没有找到,他会去寻找“ed”,然后他会去分别寻找“e”和“d”,这些肯定会有一个入口。然后他会连结他的结果。 @ Nikhil PLZ纠正我,如果我错了,如果不是,那么我在我以前的评论中提到的是一个合法的问题... – 2012-07-24 09:44:45