通过交叉第一个和最后一个共同字符

时间:2016-06-01 10:23:46

标签: c# algorithm

我有一个初始列表如下:

ab, aj, ad, ae, bd, bc, bd, bg, bj, dj

算法应该与此列表中元素的第一个和最后一个共同字符相交以形成

abd, abj, bdj

最后(结果)

abdj

这是最长的交叉点。

有关算法的任何建议吗?

1 个答案:

答案 0 :(得分:0)

看起来像一个简单的图搜索。这是一个解决方案,但没有花哨的东西(循环检查,缓存路径)。您应该添加这些以获得最佳性能。请注意,这是一个完整的图搜索及其所有弱点(即组合爆炸,NP等)

static List<string> _graph = new List<string>() { "ab", "aj", "ad", "ae", "bd", "bc", "bd", "bg", "bj", "dj" };

static void Main(string[] args)
{
    string longest = string.Empty; // Result will be here.
    foreach (string node in _graph)
        GenerateChildren(node,ref longest);
}

static void GenerateChildren(string parent, ref string longest)
{
    // Store longest path.
    if (parent.Length > longest.Length)
        longest = parent;
    foreach (string child in _graph.Where(child=>parent.EndsWith(child.Substring(0,1))))
        GenerateChildren(parent+child.Substring(1),ref longest);
}